C++ 父进程未完全从命名管道读取数据
我正在尝试分叉一个进程并执行一个命令。我正在创建一个命名管道,并尝试从将STDOUT写入管道的子进程执行命令。父进程将从管道中读取。我的问题是父进程没有完全从管道读取数据。这是代码C++ 父进程未完全从命名管道读取数据,c++,c,C++,C,我正在尝试分叉一个进程并执行一个命令。我正在创建一个命名管道,并尝试从将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, STD
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;
}
您希望使用管道,而不是fifo,这样就不需要创建文件系统条目。正如@Christian所说,您还需要确保两个进程同时运行,否则管道/fifo可能会阻塞并导致程序挂起 试试下面的方法
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
int pipe_fd[2];
pipe(pipe_fd);
if (fork() == 0) {
dup2(pipe_fd[1], STDOUT_FILENO);
dup2(pipe_fd[1], STDERR_FILENO);
close(pipe_fd[0]);
close(pipe_fd[1]);
char *arg_list[] = {"/bin/echo", "hello", 0};
execv(arg_list[0], arg_list);
__builtin_unreachable();
} else {
close(pipe_fd[1]);
char buf[32];
int count;
for (;;) {
count = read(pipe_fd[0], buf, sizeof(buf));
if (count <= 0) break;
write(STDOUT_FILENO, buf, count);
}
}
return 0;
}
嗯,你的阅读有一个严重的缺陷:你在等孩子死后才真正开始阅读。这意味着你依赖于事物来完全适应系统提供的任何缓冲区;除此之外的任何事情都会导致僵局。不过,我不知道这是否也会导致你看到的症状。@ChristianStieber:WNOHANG选项会确保waitpid正确运行吗?我能够在父进程中读取管道,但它没有完全读取当函数(如alarmnsecs)返回时,会阻止读取;火灾?是的,报警发送一个信号,所以read将返回EINTR。当SIGALRM发送时,程序终止,对吗?当读取以EINTR终止时,我们如何处理?您需要确保SIGALRM不会导致程序终止,否则读取将永远不会返回。看看我们的行动。