Processus père et tubes
Bonjour,
Ma question est la suivante: Est-ce qu'un processus père peut écrire à la fois sur 2tubes différents?
Merci
Ma question est la suivante: Est-ce qu'un processus père peut écrire à la fois sur 2tubes différents?
Merci
Configuration: Linux Firefox 3.0.3
6 réponses
-
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 -
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 -
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);
} -
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 -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
-
Oui et return (((0))), aussi :-) En attendant, rajoute ton accolade parce que là, ça ne marche pas sans :-)