c - 当我尝试重新创建管道/分叉一个新进程时,进程卡住了
问题描述
我正在尝试为自制外壳重新创建管道,并且可以在这种情况下使管道正常工作:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int stat_loc;
int pipefd[2];
pipe(pipefd);
pid_t pid = fork();
if(pid != 0)
{
waitpid(pid, &stat_loc, WUNTRACED);
close(pipefd[1]);
dup2(pipefd[0], 0);
close(pipefd[0]);
execlp("cat", "cat", "-e", NULL);
}
else
{
close(pipefd[0]);
dup2(pipefd[1], 1);
close(pipefd[1]);
execlp("ls", "ls", NULL);
}
//do something else
printf("out to parent");
return 0;
}
我会使用上面的功能,但我需要保持父进程正常工作。
但是当我再添加一个叉子时,这个过程就卡住了
execlp("cat", "cat", "-e", NULL);
这是卡住的完整尝试:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int stat_loc;
int pipefd[2];
pipe(pipefd);
pid_t pid1 = fork();
if (pid1 == 0)
{
pid_t pid = fork();
if(pid != 0)
{
waitpid(pid, &stat_loc, WUNTRACED);
close(pipefd[1]);
dup2(pipefd[0], 0);
close(pipefd[0]);
execlp("cat", "cat", "-e", NULL);
}
else
{
close(pipefd[0]);
dup2(pipefd[1], 1);
close(pipefd[1]);
execlp("ls", "ls", NULL);
}
}
waitpid(pid1, &stat_loc, WUNTRACED);
//do something else
printf("out to parent");
return 0;
}
谢谢您的帮助!!
解决方案
您还需要关闭父进程中的所有管道 FD。否则,cat
永远不会从其输入管道中读取 EOF。
添加:
close(pipefd[0]);
close(pipefd[1]);
前:
waitpid(pid1, &stat_loc, WUNTRACED);
推荐阅读
- java - Apache Ignite SQL 查询结果差异
- kubernetes - Kubernetes - 验证部署
- django - Django modelManager - 在视图/列表视图中看不到实例/对象 - 没有错误
- ios - 我们可以通过 Apple 商务管理器分发 Enterprise ios 应用程序吗?
- jsf - 如何在 af:column 中使用 jsf ui:repeat 来获取每个表条目的列表?
- python - 多维 Numpy ndarray 到 csv 或 pandas df
- php - 函数不会在 - if else - 语句内运行两次
- node.js - 在while循环NODEJS中停止异步进程
- powershell - 是否有 Powershell 命令来返回防火墙的运行固件版本?
- r - 我怎样才能只追踪一次?