C 完成后停止执行Fork

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个元素,最后一个元素是空指针。能否

我试图用一个管道和一个分叉在C中实现这个命令

    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);
    }            
}