2013-02-09 8 views
5

ich einige Probleme mit diesem Code zu experimentieren:Rohr Anruf und Synchronisation

#include <stdio.h> 
#include <stdlib.h> 

#define SIZE 30 
#define Error_(x) { perror(x); exit(1); } 
int main(int argc, char *argv[]) { 

    char message[SIZE]; 
    int pid, status, ret, fd[2]; 

    ret = pipe(fd); 
    if(ret == -1) Error_("Pipe creation"); 

    if((pid = fork()) == -1) Error_("Fork error"); 

    if(pid == 0){ //child process: reader (child wants to receive data from the parent) 
     close(fd[1]); //reader closes unused ch. 
     while(read(fd[0], message, SIZE) > 0) 
       printf("Message: %s", message); 
     close(fd[0]); 
    } 
    else{//parent: writer (reads from STDIN, sends data to the child) 
     close(fd[0]); 
     puts("Tipe some text ('quit to exit')"); 
     do{ 
      fgets(message, SIZE, stdin); 
      write(fd[1], message, SIZE); 
     }while(strcmp(message, "quit\n") != 0); 
     close(fd[1]); 
     wait(&status); 
    } 
} 

-Code funktioniert gut, aber ich kann nicht erklären, warum! Es gibt keine explizite Synchronisierung zwischen übergeordneten und untergeordneten Prozessen. Wenn der Child-Prozess vor dem Parent ausgeführt wird, muss read 0 zurückgeben und der Prozess endet, aber aus irgendeinem Grund wartet er auf die Parent-Ausführung. Wie erklärst du das? Vielleicht vermisse ich etwas.

(Edited)

+2

Warum erwarten Sie lesen 0 zurück? Sie stellen nicht blockierende E/A nirgends ein. – Mat

+1

... Und es wäre nicht 0 für nicht blockierende E/A. –

+0

Ist 'Lesen' Blockieren für den Prozess? –

Antwort

5

Da Sie nicht O_NONBLOCK in pipe2 verwendet haben, read ist standardmäßig blockiert. Daher wartet es, bis Daten in die Pipe geschrieben werden.

+0

Wenn' (fd [0], Nachricht, SIZE)> 0 'in while Bedingung ist falsch? –

+0

Es wird falsch, wenn das Rohr am anderen Ende geschlossen ist; Wenn Sie noch nichts geschrieben haben, nimmt der Leser an, dass Sie später etwas schreiben möchten. IOW die Pipe fungiert als implizite Synchronisation. – loreb

+2

Das Rohr ist überhaupt nicht implizit. Es ist ein sehr expliziter Synchronisationsmechanismus. Wahrscheinlich am häufigsten. Wahrscheinlich auch der einfachste. –