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