在這個程式中,2 個子行程被分叉,然后一個通過 . 向另一個發送字串pipe
。waitpid(read_child, NULL, 0);
通信完成后,父行程卡在等待從管道( )讀取的子行程退出。它可以在沒有任何waitpid
(兩個子行程退出)的情況??下正常作業,或者只是等待write_child
. 這是為什么?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
int pipe_fd[2];
if (pipe(pipe_fd) == -1)
{
// fail to build pipe
perror("pipe");
exit(EXIT_FAILURE);
}
int read_child = fork();
if (read_child == 0)
{
sleep(0.5);
close(pipe_fd[1]);
printf("child %d read from pipe:\n", (int)getpid());
char buffer;
while (read(pipe_fd[0], &buffer, 1) > 0)
{
write(STDOUT_FILENO, &buffer, 1);
}
write(STDOUT_FILENO, "\n", 1);
close(pipe_fd[0]);
printf("read child exits\n");
exit(0);
}
int write_child = fork();
if (write_child == 0)
{
sleep(0.5);
close(pipe_fd[0]);
printf("child %d writes to pipe\n", (int)getpid());
char message[100];
sprintf(message, "greeting from brother %d", (int)getpid());
write(pipe_fd[1], message, strlen(message));
close(pipe_fd[1]);
printf("write child exits\n");
exit(0);
}
waitpid(read_child, NULL, 0);
// waitpid(write_child, NULL, 0);
return 0;
}
uj5u.com熱心網友回復:
TL;博士
- 在父行程解決問題
close(pipe_fd[1]);
之前添加。waitpid(read_child, NULL, 0);
這里的問題是,父行程還持有對兩個管道 fd 的參考。
阻塞直到某些資料可用,read
或者當由 標識的管道fd
關閉并read
立即回傳 0 位元組。
最初,寫入管道 fd 的參考計數為 2,來自寫入器子級和父級。父阻塞等待 writer,然后 writer 退出,refcount 減為 1。隨著 writer 退出,父阻塞等待回傳,父也退出。Refcount 減為 0,管道的寫端關閉,讀卡器的阻塞read
回傳 0 位元組,讀卡器退出。
但是,如果父級在沒有先釋放其對管道 fd 寫入端的參考的情況下等待讀取器,則由于父級的最終參考,即使寫入器已退出,管道也不會關閉。這意味著,read
讀者孩子的 將永遠阻止......
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/470645.html
上一篇:將整數矩陣寫入.txt