Question

Je vous écris un petit programme, et voici ce qu'il doit faire.

Dans le processus principal que je dois créer un nouveau et que l'on doit exécuter un autre programme qui ne fait que printf ( « text »). Je veux rediriger le tuyau fin d'écriture sur la sortie standard et le processus principal devrait lire sa lecture de la conduite et et l'imprimer sur stdout. J'ai écrit le code, mais encore et encore, je reçois une erreur de segmentation lorsque le processus parent essaie de lire de la conduite.

#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

void write_to(FILE *f){
  char buf[50];
  fprintf(f,"KOMA");
}

int main(){
  int cpPipe[2];
  int child1_fd;
  int child2_fd;

  if(pipe(cpPipe) == -1){

    fprintf(stderr,"ERROR PIPE creation");
    exit(1);

  }else{printf("pipe couldn't be created\n");}

  child1_fd = fork();

  if(child1_fd < 0){
    fprintf(stderr, " CHILD creation error");
    exit(1);
  }

  if(child1_fd == 0){
    printf("*CHILD*\n");
    char program[] = "./Damn";
    int dupK;
    printf("stdout %d \n", STDOUT_FILENO);
    printf("stdin %d \n", STDIN_FILENO);
    printf("pipe1 %d \n", cpPipe[1]);
    printf("pipe0 %d \n", cpPipe[0]);

    // closing pipe write
    close(cpPipe[0]);
    close(1);
    dup(cpPipe[1]);

    printf("and");

    close(cpPipe[1]);
    exit(0);
  }else{
    printf("*Parent*\n");
    char *p;
    char *buf;
    FILE *pipe_read;

    close(cpPipe[1]);
    pipe_read = fdopen(cpPipe[0],"r");

    while((buf = fgets(p,30,pipe_read)) != NULL){
      printf("buf %s \n", buf);
    }

    wait();
    printf("Child is done\n");
    fclose(pipe_read);

    exit(0);
  }
}

Dois-je fermer le tuyau fin d'écriture lorsque je redirige stdout à elle?

Était-ce utile?

La solution

Uhm, ... la raison de votre erreur de segmentation est ici:

buf = fgets(p,30,pipe_read);

p est un pointeur vers nulle part essentiellement d'importance. Ce contenu est de ce qui est dans la pile au moment de l'exécution, vous ne l'initialiser. Vous en avez besoin pour pointer vers un morceau de mémoire que vous pouvez utiliser! Assigner le retour d'un appel à malloc(), ou déclarer comme char p[LEN].

Edit: vous RÉOUVERTURE aussi déjà des descripteurs de fichiers ouverts. Consultez la documentation sur fgets et pipe, je pense que vous êtes confus quant à la façon dont ils travaillent.

Maintenant, cela étant dit, le flux de votre fonction est un peu déroutant. Essayez de travailler sur le clarifier! Rappelez-vous, le code est destiné à exprimer des intentions, des idées de fonctionnalités. Essayez d'utiliser un crayon et du papier pour organiser votre programme, puis l'écrire comme code réel:.)

Vive!

Autres conseils

  

Dois-je fermer le tuyau fin d'écriture lorsque je redirige stdout à elle?

En général, oui, car si il y a un processus à la fin d'écriture de l'ouverture du tube, les processus de lecture du tuyau ne se EOF et se bloque. Il est également bien rangé aux descripteurs de fichiers proches que vous ne comptez pas utiliser, bien sûr.

Votre code dit aussi « pipe n'a pas pu être créé » dans le chemin de la réussite.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top