Waitpid用法和Bash脚本
我试图编写一个程序,其中一个程序通过while循环不断地接收用户输入,在每个循环中,在运行shell脚本的同时,派生当前程序进程的一个新子进程。这就是我目前拥有的: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';
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和状态,如果它获取多个进程,信息将丢失。