2017-11-25 5 views
1

Ich habe das einfache Producer-Consumer-Programm in C versuchen, es mit Gabel zu lösen Ich bekomme Fehler genau, wenn Produzent versucht, auf Pipe schreiben: Ich habe ein anderes Programm mit der gleichen Logik, aber dieses geschrieben Gibt mir keine Ahnung warum?C-Pipe: Bad Datei-Deskriptor

Producer fehlgeschlagen Artikel auf Rohr schreiben: Descriptor Bad Datei

Wer Ahnung, warum ich diesen Fehler? Dank

#define READ 0 
#define WRITE 1 
int mutex = 1, full = 0, empty = BUFFER_SIZE, x = 0; 

void consumer(); 

void producer(); 

int wait_(int); 

int signal_(int); 

int pipefd[2]; 

int main() { 
    printf("Starting producer-consumer problem!\n"); 
    //We intend to run the producer in parent process and the consumer in the child process 
    if (pipe(pipefd) == -1) {  /* An error has occurred. */ 
     fprintf(stderr, "%s", "The call to pipe() has failed.\n"); 
     exit(EXIT_FAILURE); 
    } 
    for (int j = 0; j < sizeof(pipefd); j++) { 
     if (pipe(&pipefd[j]) < 0) { //Initialize each pipe appropriately 
      perror("Error in making pipe..."); 
     } 
    } 
    pid_t pid = fork(); 
    if (pid < 0) { 
     perror("**********Error in creating fork()!**************\n"); 
     exit(STDERR_FILENO); 
    } else if (pid == 0) { 
     consumer();//We intend to run the consumer in child 
    } else { 
     producer();//We intend to run the producer in parent 
    } 
    return 0; 
} 

int wait_(int s) { 
    return (--s); 
} 

int signal_(int s) { 
    return (++s); 
} 

void producer() { 
    printf("Starting Producer\n"); 
    //while (1) { 
    //sleep(1); 
    if (close(pipefd[READ]) != 0) { 
     perror("Error in closing reading pipe"); 
    } 
    if (write(pipefd[WRITE], &full, 1) < 0) { 
     perror("Producer failed to write item on pipe"); 
    } 
    if ((mutex == 1) && (empty != 0)) { 
     mutex = wait_(mutex); 
     full = signal_(full); 
     empty = wait_(empty); 
     x++; 
     printf("Producer produces the item %d\n", x); 
     mutex = signal_(mutex); 
    } 
    if (close(pipefd[WRITE]) != 0) { 
     perror("Error in closing writing pipe"); 
    } 
    //} 
} 

void consumer() { 
    printf("Starting Consumer\n"); 
    //while (1) { 
    //sleep(1); 
    int status = 0; 
    wait(&status);    /* wait for all children to return back the result */ 
    if (close(pipefd[WRITE]) != 0) { 
     perror("Error in closing reading pipe"); 
    } 
    if (read(pipefd[READ], &full, 1) > 0) { 
     printf("Consumer\t%d\n", full); 
    } 
    if ((mutex == 1) && (full != 0)) { 
     mutex = wait_(mutex); 
     full = wait_(full); 
     empty = signal_(empty); 
     printf("Consumer consumes item %d\n", x); 
     x--; 
     mutex = signal_(mutex); 
    } 
    if (close(pipefd[READ]) != 0) { 
     perror("Error in closing reading pipe"); 
    } 
    //} 
} 
+0

Wo sind 'READ' und' WRITE' definiert? – Frxstrem

+0

Was ist der Wert von READ & WRITE? Ist es 0 & 1? – achal

Antwort

1

Der sizeof Operator gibt die Größe in Bytes. In einem typischen System, in dem int vier Bytes ist, würde sizeof(pipefd) den Wert 8 ergeben. Welches ist nicht die richtige Anzahl von Elementen für Ihre Schleife.

Auch ist pipe(&pipefd[j]) nicht korrekt. Die beiden Rohre in pipefd sind bereits initialisiert "geeignet". Es ist keine weitere Initialisierung erforderlich. Besonders, da sowohl in diesem als auch in dem vorherigen Fall Sie undefined behavior haben werden.

+0

Danke! Das hat mein Problem gelöst. Ist es genug, Pip (Pipefd) für die Initialisierung aufzurufen? – matio

+0

@Metao Ja, das ist genug. –

+0

Nochmals vielen Dank. Ist es zwingend erforderlich, den Schreibdeskriptor von pipe zu schließen? Wie mache ich es während Iterator und um sicherzustellen, dass wir es nicht zweimal schließen? – matio

Verwandte Themen