我想分叉進程並執行命令。我正在創建一個命名管道,並試圖從將STDOUT寫入管道的子進程執行命令。父進程將從管道讀取。我的問題是父進程沒有完全從管道讀取數據。這裏是代碼。父進程不完全讀取命名管道中的數據
fifo_fd = mkfifo(MY_FIFO, 0666);
FILE *fp = fdopen(fifo_fd, "r");
childpid = fork();
if (childpid == 0)
{
dup2(fifo_fd, STDOUT_FILENO);
dup2(fifo_fd, STDERR_FILENO);
close(fifo_fd);
execv(arg_list[0], arg_list);
_exit (127);
}
else
{
//parent process
if(waitpid(childpid, &status,WNOHANG) == -1) {
// now we kill the child and return failure.
}
fcntl(fd, F_SETFL, O_NONBLOCK);
while((fgets(buf, sizeof(buf)-1,fp))) {
strcat(result,buf); //we copy the buf to result
}
return success;
}
那麼,你的閱讀有一個嚴重的缺陷:在你真正開始閱讀之前,你正在等待孩子死亡。這意味着你依賴於事物來完全適應系統提供的任何緩衝區;除此之外的任何事情都會導致僵局。不管這是否也會導致你所看到的症狀是我不能說的,但是。 –
@ChristianStieber:WNOHANG選項將確保waitpid dosent掛機?我能夠從父進程中的管道讀取,但它完全讀取 – prabhu