Processus père et tubes

hwida12 Messages postés 18 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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. hwida12 Messages postés 18 Statut Membre
       
      Merci bcpp pr la réponse.
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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. hwida12 Messages postés 18 Statut Membre
       
      Merci oci pr la réponse
      0
  3. 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
  4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. hwida12 Messages postés 18 Statut Membre
     
    Merci pour ta réponse mais ça marche oci "return(0);"
    0
  7. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Oui et return (((0))), aussi :-) En attendant, rajoute ton accolade parce que là, ça ne marche pas sans :-)
    0