Processus père et tubes

hwida12 Messages postés 18 Statut Membre -  
mamiemando Messages postés 34188 Statut Modérateur -
Bonjour,
Ma question est la suivante: Est-ce qu'un processus père peut écrire à la fois sur 2tubes différents?
Merci

6 réponses

mamiemando Messages postés 34188 Statut Modérateur 7 890
 
Oui, de la même façon qu'il peut écrire dans plusieurs fichiers à la fois. En langage C, pour un fichier c'est la fonction fopen, pour un processus, c'est popen :
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/popen.3.html

popen est une manière élégante d'ouvrir un processus fils depuis un processus père, mais après tout dépend de tes besoins. En outre, popen fait référence dans son man à d'autres fonctions permettant de manipuler des processus (voir en bas de page).

Bonne chance
0
hwida12 Messages postés 18 Statut Membre
 
Merci bcpp pr la réponse.
0
dubcek Messages postés 19021 Statut Contributeur 5 639
 
hello
en shell, on passe par des fichiers FIFO pour qu'une tâche "alimente" plusiers pipes, ici 3:

mkfifo fifo1 fifo2
commande1 < fifo1 > log1 2>&1 &
commande2 < fifo2 > log2 2>&1 &
commande ¦ tee fifo1 fifo2 ¦ commande3 > log3 2>&1
0
hwida12 Messages postés 18 Statut Membre
 
Merci oci pr la réponse
0
hwida12 Messages postés 18 Statut Membre
 
Bonjour,
J'ai créé une mémoire partagée entre processus père et son fils le père écrit des données et le fils lit ses données.Le programme m'affiche l'erreur suivante:

memoire.c: In function ‘main’:
memoire.c:107: error: expected declaration or statement at end of input

Voila le programme que j'ai fait:

////////////////////////////////////

#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h>
#include<stdlib.h>
#include <signal.h>
#include <errno.h>
#define SHM_SIZE 1024



int main(int argc, char *argv[])

{
key_t clef ; // la clef associee au segment
pid_t pid ;
char *mem ;
int shmid ; // l'identificateur du segment de memoire partagee
int t[5]={214,4553,65,90,123};
typedef struct
{
int t1[5];
}structure_partagee;
// J'instancie une structure "structure_partagee" et je l'appelle Data.
structure_partagee *Data;

char *name = (char *) malloc(15*sizeof(char)) ;
int i;
/* construire
une cle identifiant le segment */
clef = ftok(name,(key_t) clef) ;

/*indiquer
les droits d'acces de ce segment de memoire */

shmid = shmget((key_t)clef, SHM_SIZE,0644|IPC_CREAT ) ;
if ( shmid== -1 )
{
perror("shmget") ;
exit(1) ;
}



pid =fork() ;


if(pid > 0)
{//père



mem = (char*) shmat(shmid,(void*)0, 0);
if (mem ==(char*)-1)
{
perror("shmat") ;
exit(1) ;

}
for(i=0; i<4; i++)
{
Data->t1[i]=t[i];
}



if(shmdt(mem)==-1)
{
perror("shmdt");
exit(1);
}



}


else if(pid==0)//fils


{
printf("Je suis le fils\n") ;
mem = (char*)shmat(shmid,(void*)0,0) ;
if (mem ==(char*)-1){
perror("attachement impossible") ;
exit(1) ;

}
printf("Affichage fils1\n");
for(i=0; i<4; i++)
{
printf("%d",Data->t1[i]);
}


printf("ecrit dans le segment: %s \n",mem);




if(shmdt(mem)==-1)
{
perror("shmdt");
exit(1);
}
return(0);
}
0
mamiemando Messages postés 34188 Statut Modérateur 7 890
 
Ben oui il manque une accolade. C'est pour ça que c'est bien d'indenter... Par ailleurs return n'est pas une fonction et on écrit plutôt "return 0;" que "return(0);".

Bonne chance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hwida12 Messages postés 18 Statut Membre
 
Merci pour ta réponse mais ça marche oci "return(0);"
0
mamiemando Messages postés 34188 Statut Modérateur 7 890
 
Oui et return (((0))), aussi :-) En attendant, rajoute ton accolade parce que là, ça ne marche pas sans :-)
0