C 完成后停止执行Fork
我试图用一个管道和一个分叉在C中实现这个命令C 完成后停止执行Fork,c,linux,unix,fork,C,Linux,Unix,Fork,我试图用一个管道和一个分叉在C中实现这个命令 cat /proc/<pid>/limits | grep "Max file size \|Max open files\|Max processes\|Max pending signals" 看起来您可能会将子项(案例0:)和父项(默认值:)与您想要的相反。至少从示例中可以看出,child是管道读取器,parent是管道编写器。command[]和command2[]数组需要有3个元素,最后一个元素是空指针。能否
cat /proc/<pid>/limits |
grep "Max file size \|Max open files\|Max processes\|Max pending signals"
看起来您可能会将子项(案例0:)和父项(默认值:)与您想要的相反。至少从示例中可以看出,child是管道读取器,parent是管道编写器。command[]和command2[]数组需要有3个元素,最后一个元素是空指针。能否检查
execvp
调用是否失败?man execvp:exec()函数仅在发生错误时返回。
您没有将上述代码置于上下文中。如果问题是您希望您的程序在cat
/grep
业务之后继续执行某些其他操作,那么问题正是EOF指出的:如果exec()
函数成功,则不会返回。您的进程分叉一次,父进程和子进程都执行execvp()
。除非出现故障,否则控制不会返回到原始程序。是的,如果希望主进程在之后执行其他工作,请设置另一个fork来运行grep
。如果主进程不打算很快退出,则应通过wait()
或waitpid()
收集两个子进程,但如果不需要子进程在继续之前完成,则不需要立即这样做。此外,父级应关闭其管道副本的两端。这不能解释终止问题,并且与OP的断言不一致,即cat
和grep
组合实际上按预期工作。实际上,在这种情况下,在子系统中运行的cat
命令被正确设置为写入程序,而在父系统中运行的grep
命令被正确设置为读取程序。就目前而言,这一切都是正确的。
char * command[3];
char str[25] = "";
strcat(str, "/proc/");
strcat(str, pid);
strcat(str, "/limits");
command[0] = "cat";
command[1] = str;
command[2] = NULL;
int fd2[2];
pipe(fd2);
pid_t pidlimits;
switch (pidlimits = fork()) {
case 0:
//Execute cat /proc/$pid/limits here
dup2(fd2[1], 1);
close(fd2[0]);
execvp(command[0], command);
exit(1);
default:
dup2(fd2[0], 0);
close(fd2[1]);
//Build the grep command here
char * command2[3];
char grepFilter[100] = "\"\\|Max file size\\|Max pending signals\\|Max processes\\|Max open files\\|\"";
command2[0] = "grep";
command2[1] = grepFilter;
command2[2] = NULL;
execvp(command2[0], command2);
exit(1);
}
}