Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Waitpid用法和Bash脚本_Bash_Unix_Scripting_Pid - Fatal编程技术网

Waitpid用法和Bash脚本

Waitpid用法和Bash脚本,bash,unix,scripting,pid,Bash,Unix,Scripting,Pid,我试图编写一个程序,其中一个程序通过while循环不断地接收用户输入,在每个循环中,在运行shell脚本的同时,派生当前程序进程的一个新子进程。这就是我目前拥有的: int main(int argc, char **argv) { while(!feof(stdin)){ printf("Port Number:"); fgets(portno, 100, stdin); input[strlen(portno) - 1] = '\0';

我试图编写一个程序,其中一个程序通过while循环不断地接收用户输入,在每个循环中,在运行shell脚本的同时,派生当前程序进程的一个新子进程。这就是我目前拥有的:

int main(int argc, char **argv)
{
    while(!feof(stdin)){
        printf("Port Number:");
        fgets(portno, 100, stdin);
        input[strlen(portno) - 1] = '\0';
        pid_t pid = fork();

        if (pid < 0){
            die("fork did not work");
        } else if (pid == 0){
            fprintf(stderr, "[pid=%d] ", (int)getpid());
            fprintf(stderr, "process started on port %s\n", portno);
           execl("./netcattest.sh", "netcattest.sh", portno, (char *)0);
            die("program failed");
        } else {
            /*
            if (waitpid(.... NEED HELP ON THIS PART
            */
            fprintf(stderr, "[pid=%d] ", (int)pid);
            fprintf(stderr, "program terminated\n");
        }
    }

return 0;
}
int main(int argc,char**argv)
{
而(!feof(stdin)){
printf(“端口号:”);
fgets(端口号,100,标准输入);
输入[strlen(端口号)-1]='\0';
pid_t pid=fork();
if(pid<0){
模具(“叉子不起作用”);
}否则如果(pid==0){
fprintf(stderr,“[pid=%d]”,(int)getpid());
fprintf(stderr,“进程在端口%s上启动\n”,端口号);
execl(“./netcattest.sh”,“netcattest.sh”,端口号,(字符*)0);
模具(“程序失败”);
}否则{
/*
如果(waitpid(……需要这方面的帮助
*/
fprintf(stderr,[pid=%d],(int)pid);
fprintf(stderr,“程序终止\n”);
}
}
返回0;
}
我的问题是阅读waitpid文档,我对如何使用该函数有点不清楚。我想做的是,当程序是父进程时,我希望能够以某种方式识别当前已终止的所有进程

例如,如果我运行了3次循环,并且在第二次循环之后的某个地方第一个进程终止,我希望能够以某种方式识别终止的进程的pid

我知道这涉及到使用WNOHANG选项,但我真的很困惑它是如何工作的

非常感谢你们


编辑:还有,有没有一种快速的方法来对一段代码进行4个缩进,而不仅仅是将每一行单独隔开?

我从未使用过此功能,但我对文档的理解是,您应该执行以下操作:

int status;
pid_t pid = waitpid(-1, &status, WNOHANG);

此时,
pid
将为-1表示错误,如果没有进程退出,则为0,否则为已退出进程的pid(任意选择;要等待所有进程,只需继续调用它)。您可以使用手册页上指定的各种宏函数检查
状态
,以确定进程如何结束及其退出代码。

是,选择代码并单击
{}
icon。有什么方法可以获取它,以便我可以提取所有已退出的进程,而不是任意选择一个进程?谢谢你的回答。我编辑了我的答案——一直调用waitpid,直到它返回0。因为waitpid只返回一个PID和状态,如果它获取多个进程,信息将丢失。