gpt4 book ai didi

子进程卡在管道内

转载 作者:行者123 更新时间:2023-11-30 14:25:05 27 4
gpt4 key购买 nike

当我使用 ls | 执行此函数时head,它在打印出文件和目录后卡在第二个子进程中。有人能告诉我我想念这里什么吗?提前致谢

int unipipe(char* lhs[], char* rhs[])
{
int pfd[2];
int status, cid;
pid_t pid;
char buf;
if((lhs != NULL) && (rhs != NULL))
{
if(pipe(pfd) != 0)
{
perror("pipe");
return -1;
}
if((pid = fork()) < 0)
{
perror("fork");
return -1;
}
else if(pid == 0)
{
close(1); //close the unused read end
dup2(pfd[1], STDOUT_FILENO);
//execute the left-hand side command
close(pfd[0]);
execvp(lhs[0], lhs);
_exit(EXIT_SUCCESS);
}

if(setpgid(pid, 0) < 0)
{
perror("setpgid");
return -1;
};

cid = waitpid(pid, &status, 0);
if((pid = fork()) == 0)
{
close(0);
dup2(pfd[0], STDIN_FILENO);
close(pfd[1]); //close the unused write end
execvp(rhs[0], rhs);
_exit(EXIT_SUCCESS);
}
else
{
waitpid(pid, &status, 0);
}
}

最佳答案

您等待第一个进程退出,然后再启动第二个进程。每个管道都有一个缓冲区,一旦该缓冲区已满,I/O 功能就会阻塞,等待从管道中读取几个字节,以便更多的字节可以“流入”。您的第一个进程很可能在管道上阻塞,因此永远不会退出。

我会声明两个 pid_t 类型的变量,每个子变量一个,并且只有在两者都成功启动后才等待它们。

关于子进程卡在管道内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10747185/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com