Domanda

Sto scrivendo un piccolo programma, e qui è quello che dovrebbe fare.

Nel processo principale che ho per creare uno nuovo e che si dovrebbe eseguire un altro programma che fa solo printf ( "testo"). Voglio riorientare la fine scrittura tubo sul stdout e il processo principale dovrebbe leggere dalla sua lettura tubo ed e stamparlo su stdout. Ho scritto ma ancora una volta e ancora una volta il codice ottengo un errore di segmentazione quando i tentativi di processo genitore di leggere dal tubo.

#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);
  }
}

Devo chiudere l'estremità del tubo scrittura quando ho reindirizzare stdout ad esso?

È stato utile?

Soluzione

Uhm ... il motivo per il vostro errore di segmentazione è qui:

buf = fgets(p,30,pipe_read);

p è un puntatore ad sostanzialmente nulla di importanza. E 'il contenuto è tutto ciò che è nella pila, al momento dell'esecuzione, non hai mai inizializzato. Ne avete bisogno per puntare a un blocco di memoria è possibile utilizzare! Assegnare il ritorno di una chiamata malloc() ad esso, o dichiareremo come char p[LEN].

Edit: si sta anche la riapertura già descrittori di file aperti. Controllare la documentazione su fgets e pipe, penso che si sono confusi su come funzionano.

Ora, detto questo, il flusso del vostro funzione è un po 'di confusione. Prova a lavorare su chiarire esso! Ricordate, il codice è destinato ad esprimere intenzioni, idee di funzionalità. Provare a utilizzare carta e penna per organizzare il vostro programma, e poi scrivere come codice vero e proprio:.)

Cheers!

Altri suggerimenti

  

Devo chiudere l'estremità del tubo scrittura quando ho reindirizzare stdout ad esso?

In generale, sì, perché mentre v'è un processo con l'estremità di scrittura del aperta tubo, i processi di lettura il tubo non sarà possibile ottenere EOF e si bloccherà. E 'anche in ordine a chiudere i descrittori di file che non si intende utilizzare, ovviamente.

Il tuo codice dice anche "tubo non può essere creata" nel percorso di successo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top