如何从父进程获取子进程的状态,即它是停止、继续还是退出?对于 Linux,C 语言
Posted
技术标签:
【中文标题】如何从父进程获取子进程的状态,即它是停止、继续还是退出?对于 Linux,C 语言【英文标题】:How do I get the status of a child process from a parent, i.e. has it stopped, continued, or exited? For Linux, C lang 【发布时间】:2021-07-07 04:16:53 【问题描述】:这是 Linux (ubuntu) 中的 C 语言程序。我一直在试图弄清楚如何从父进程那里获取子进程的状态。
我编写了一个简单的子进程,它在 25 秒内计数到 25,并将滴答计数输出到标准输出。在父进程中,我 1> 停止子进程 几秒钟。 2> 继续 几秒钟,然后 3> 杀死子进程。 我想获取我一直在使用的子进程的状态waitpid() 函数。但是,我发现如果我使用标志:
waitCondition = WUNTRACED | W继续
它确实返回“已停止”状态,但在处于继续状态时会挂起。
相反,如果我将标志设置为:
waitCondition=WUNTRACED | W续 |挂机
停止状态没有注册,但是继续状态是通过waitpid()注册的。
我正试图让父级在停止、继续或退出时识别状态。
我有下面的代码。有没有人对此有任何想法?谢谢!
int waiting4pid()(pid_t processID)
int waitCondition = WUNTRACED | WCONTINUED;
int currentState;
while (waitpid(processID,¤tState,waitCondition) > 0)
if(WIFCONTINUED(currentState))
printf("\n currentState = continued!\n");
if(WIFSIGNALED(currentState))
printf("\n currentState = signaled!\n");
if(WIFSTOPPED(currentState))
printf("\n currentState = stopped!\n");
void sigTest()
pid_t processID;
processID = fork();
if(processID ==0) // child
// tmp/loop is an application that counts to 25 in 25 seconds and then exits.
execlp("tmp/loop", "tmp/loop", NULL);
else
sleep(2);
printf("\n Stop!");
kill(processID, SIGSTOP);
waiting4pid()(processID);
sleep(2);
printf("\n Continue!");
kill(processID,SIGCONT);
waiting4pid()(processID);
sleep(2);
printf("\n Kill!");
kill(processID, SIGKILL);
waiting4pid()(processID);
void main()
sigTest();
【问题讨论】:
您希望waitpidstatus
函数如何退出while
循环?您向孩子发送信号,然后致电waitpidstatus
。然后waitpidstatus
将获取状态更改并返回等待下一个状态更改。但是不会有下一个状态变化,因为父级现在在waitpidstatus
上被阻止,因此它无法发送下一个信号。
@kaylum 谢谢!我对 waitpid() 的工作原理有一个误解。
【参考方案1】:
为了检查进程是否退出,请执行以下操作:
if(WIFEXITED(status)
// do your stuff
// you can also check the exit status
if(WEXITSTATUS(status) != EXIT_SUCCESS)
// the child process exited with error
正如@kaylum 在问题下的评论中已经提到的那样,waitpid()
调用会阻塞,直到孩子改变状态。但是您可以通过调用waitpid()
并设置WNOHANG
标志来修改此行为(如果您需要监视子进程但同时在父进程中执行一些其他操作,这将很有用;或者您可以waitpid()
in一个单独的线程)。
【讨论】:
以上是关于如何从父进程获取子进程的状态,即它是停止、继续还是退出?对于 Linux,C 语言的主要内容,如果未能解决你的问题,请参考以下文章