2012-04-12 3 views
2

Ich verwende die Pipe, um die Kommunikation zwischen Eltern-Proc und Child-Proc herzustellen. Das Buch, das ich lese sagt, wenn in Elternproc, ich muss schließen Pipefd [1], aber ich habe das nicht getan und nichts anderes passieren, so meine Frage ist, "wenn ich nicht die Pipefd [1] schließen, ist da alles unkontrolliert? " mit freundlichen Grüßen!Ich habe das Rohrende nicht geschlossen, ist da was falsches passiert?

int pipefd[2]; 
if(pipe(pipefd) == -1) 
{ 
    perror("pipe communication error"); 
    exit(EXIT_FAILURE); 
} 
int fd = fork(); 
if(fd < 0) 
{ 
    perror("fork child process error"); 
    exit(EXIT_FAILURE); 
} 
if(fd != 0)//run in parent proc 
{ 
    int a = -1; 
    int i = 1; 
    //close(pipefd[1]);       ## here! ## 
    while(i) 
    { 
     read(pipefd[0], &a, sizeof(a)); 
     printf("%d\n", a); 
     sleep(4); 
    } 
} 
else//run in child proc 
{ 
    int i = 1; 
    //close(pipefd[0]);       ## here! ## 
    while(i) 
    { 
     write(pipefd[1], &i, sizeof(i)); 
     i++; 
     sleep(1); 
    } 
} 

Antwort

0

Nun, die Empfehlung, das Rohr zu schließen ist, um Sie von sich selbst zu schützen: so dass Ihre Leser Prozess in das Rohr nicht versehentlich schreiben, und der Schreiber Prozess liest nicht versehentlich einige Daten aus . Im Allgemeinen ist es eine Art defensiver Programmiertechnik.

Solange Sie nicht auf die zu schließende Leitung zugreifen, sollte nichts Schlimmes passieren.

Nun, ich bin nicht 100% richtig hier: meine Aussage ist für ein einfaches Programm wie das Ihre wahr, aber wenn Sie offen und vergisst viele Rohre zu schließen, dann wird Ihr Programm Lecks sie, und früher oder später (normalerweise nach 255 oder so offenen Rohren, aber YMMV), wäre es nicht möglich, ein neues zu öffnen. Weil die ganzen Rohrschlitze von den undichten Rohren verbraucht werden.

Dies ist jedoch nicht für Ihr Programm der Fall.

Aber trotzdem würde ich empfehlen, die Rohre zu schließen. Auf diese Weise erhalten Sie einen Fehler, wenn Sie versehentlich auf das falsche Pipe-Ende zugreifen.

1

Wenn der Leser das Schreibende der Pipe nicht schließt, erhält er das Dateiende nicht, wenn der Schreiberprozess es schließt (weil für die Schreibseite immer noch ein Dateideskriptor geöffnet ist).

+0

nette Beobachtung! – Vlad

Verwandte Themen