1

Voilà, je suis en train de bosser avec les pipes, et j'ai constater d'une part que les fonctions read et write ne sont pas blocante contrairement a ce qu'explique mon cours... et d'autre part, je me posait la question de savoir quand le system detruit le pipe. Le detruit t'il quand il n'y a plus aucun descripteur de pipe ouvert?

merc

2

Hum, le bois de boulogne et beaucoups mieu pour ce genre de question dehors
avatar
"Pigs can fight for food but know how to unite together against a bear." - H'Mong Proverb.

C'est vieux tout ça...

«On peut toujours plus que ce que l'on croit pouvoir.»
[ Joseph Kessel ]

3

./1> t'as la reponse a tes questions dans le man(2) de pipe gol
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

4

./1> t'as la reponse a tes questions dans le man(2) de pipe

>> je vois pas non :/

5

Il a peut-etre oublié de préciser... le man (2) pipe de NetBSD grin
So much code to write, so little time.

6

boah heu hem, effectivement, mais c'est un detail ca trioui
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

7

c'est quand même bizarre qu'aucune (vraie) fille n'ait répondu dans ce topic tripo

8

Tous des perverstongue

Bon j'ai du faire une 10eine de man2 pipe sur le net pour enfin trouver la reponse
The pipe itself persists until all its associated descriptors are closed.


D'ailleur ca m'enerve que sur mon ibook, il me donne pas de man pipe de programmation en C (il me donne une fonction pipe appelé en shell:/)

9

JackosKing
: D'ailleur ca m'enerve que sur mon ibook, il me donne pas de man pipe de programmation en C (il me donne une fonction pipe appelé en shell:/)

Bien sûr que si. man man pour apprendre à utiliser man.
So much code to write, so little time.

10

Ha je suis con tongue

11

triso
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

12

bon j'ai un probleme, je veux faire l'equivalent de:
sort < fichier | grep chaine | tail > sortie.
j'ai programmé la fonction, mais j'ai un probleme au niveau de la redirection tail > sortie:
[PRE]
void func2(char *pNameFile)
{
int fildes1[2],fildes2[2],dligne1,dligne2;
fildes1[0]=fildes1[1]=fildes2[0]=fildes2[1]=dligne1=dligne2=0;

if (pipe(fildes1) ==-1)
exit(-1);
switch(fork())
{
case -1:
// Erreur
break;
case 0:
// fils1
close(fildes1[ECRITURE]);
if ( pipe(fildes2)==-1 )
break;
switch(fork())
{
case -1:
break;
case 0:
// fils2
close(fildes1[LECTURE]);
close(fildes2[ECRITURE]);
if (dup2(fildes2[LECTURE],STDIN_FILENO) == -1
|| mkfifo("sortie",S_IRWXU|S_IRWXG|S_IRWXO)==-1
|| (dligne2=open("sortie",O_RDWR)==-1)
|| dup2(dligne2,STDOUT_FILENO) ==-1)
break;
close(fildes2[LECTURE]);
close(dligne2);
execlp("tail","tail",NULL);
break;
default:
// fils1
close(fildes2[LECTURE]);
if (dup2(fildes1[LECTURE],STDIN_FILENO) == -1
|| dup2(fildes2[ECRITURE],STDOUT_FILENO) == -1)
break;
close(fildes1[LECTURE]);
close(fildes2[ECRITURE]);
execlp("grep","grep","chaine",NULL);
}
break;
default:
// pere
close(fildes1[LECTURE]);
if (dup2(fildes1[ECRITURE],STDOUT_FILENO) == -1
|| (dligne1=open("fichier",O_RDONLY)==-1)
|| dup2(dligne1,STDIN_FILENO) == -1)
break;
close(fildes1[ECRITURE]);
close(dligne1);
execlp("sort","sort","fichier",NULL);
}
printf("FATAL ERROR\n");
close(fildes1[0]); close(fildes1[1]);
close(fildes2[0]); close(fildes2[2]);
close(dligne1); close(dligne2);
exit(-1);
}
[/PRE]
j'obtient une belle erreur de redirection :/ je ne comprend pas trop pourquoi:/

13

pt1 j'ai fait de la merde.. je redirigeai sur un pipe... CIMER.

14

-

15

propose mieux, sachant qu'il faut gerer toutes les erreurs...

16

int my_fork() {
  int x = fork();
  if (x==-1)
    die("could not fork");
  return x;
}

?

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

17

je vois pas en quoi c'est mieux...

18

ça factorise le code (-> moins de risques d'erreur) et ça le rend plus lisible, et en plus ça indique clairement la cause de l'erreur ? c'est un des intérêts d'avoir un système d'exceptions, d'ailleurs...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

19

Oui, mais ca n'affiche pas le fork qui a foirétongue fork1, fork2...
Le switch montre bien les 3 etats possibles. d'ailleur si le fork echoue, on peut prevoir une solution de secours, alors que dans ton cas non.

20

Ben oui, c'est le but, si tu veux faire plus fin tu fais plus fin... Mais dans 90% des cas si un fork() ou un malloc() foire, quitter le programme est une solution potable ; c'est toujours mieux que d'avoir la flemme de vérifier le résultat ou d'avoir la moitié du code qui sert à dire que oui, on veut bel et bien quitter si y a plus un seul processus de disponible...

D'ailleurs tu n'affiches même pas le fork qui a foiré tongue (et ce serait toujours possible de donner un argument à fork() si tu y tiens, ou encore d'utiliser __LINE__ et __FILE__ comme avec assert)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

21

-

22

(mais moi si hehe)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

23

Sauf que si tu fermes pas les descripteurs, tu fais un leak ;p donc ton code n'est pas equivalenttongue

troll powaatongue

24

bah justement, il faudrait une fonction my_exit() qui libère tout tongue et si tu écris pour des systèmes qui libèrent tout en quittant le processus, c même pas nécessaire ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

25

ca chipotte ca chipottetongue

26

oui j'ai remarqué ça je voulais faire une saturation de mem en lançant plusieurs fois un processus qui faisait un malloc() sans free et bah nunux il vire les mallocs à la fin du processus #naif_qui_decouvre_en_bidouillant#

27

Attention, rien a voir entre un pipe/semaphore/zone de memoire partagee/file de messages Et malloc new.. Les premiers sont inter processus, donc ils ne sont pas liberes a la fermeture du process, mais quand tous les descripteurs de fichiers/sem etc sont libérés. le malloc etc sont dans la zone de data du process... donc si tu fais un fork, tu as duplication de cette zone, et si tu quittes ton process, tu a une desalloc de la zone datas..

28

29

./27> sauf si tu le demandes expressément, une file de message, un sémaphore, un tube nommé ou une zone de mémoire partagée ne sont pas supprimés, même une fois que tous les descripteurs les utilisant sont fermés.

30

justement à propos de pipe j'aimerais faire un truc

y'a des progs que je lance par ssh mais évidemment ils sont killés dès que je lance la session.

J'aimerais
-exécuter un processus à partir de init (ça je sais faire)

-mais aussi que son stdout soit redirigé vers un truc qui existe même après avoir fermé la session ssh, que je puisse le retrouver ensuite en faisant un tail -f machin

typiquement j'avais pensé à un pipe mais comment on fait en pratique?

(je pense à seti en mode verbose, pour voir la sortie sans monopoliser un terminal)