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
Configuration: Linux
Firefox 3.0.3

6 réponses

  1. Modérateur
    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
    1. Merci bcpp pr la réponse.
  2. Contributeur
    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
    1. Merci oci pr la réponse
  3. 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);
    }
    1. Modérateur
      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
      1. Modérateur
        Oui et return (((0))), aussi :-) En attendant, rajoute ton accolade parce que là, ça ne marche pas sans :-)