无法检测子进程是否已终止
Cannot detect if child process has been killed
我一直在堆栈溢出上阅读无数次,以确定进程是否正在运行,应该使用 kill(pid,0),但我无法让它工作
这是我的代码,它无法检测到子进程何时被杀死,我不明白为什么
(抱歉,在 stackoverflow 上转义的代码只是长代码段的痛苦)
#include <sys/signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
int main()
{
int pid = fork();
if (pid < 0)
{
printf("Forking failedn");
}
else if (pid == 0) // child process
{
do
{
printf("child processn");
sleep(1);
}while(1);
//execvp("ls", NULL); //launches the application
}
else //parent process
{
printf("parent processn");
for(int i=0;i<10;i++)
{
if(i==5)
kill(pid,SIGTERM); //kills the child process
if(kill(pid, 0) == 0)
printf("process child %d is runnign",pid);
else if(kill(pid, 0) == -1)
{
switch(errno)
{
case ESRCH: printf("process child %d is not runnign",pid); break;
case EPERM: printf("process child %d cannot be killedn",pid); break;
default: printf("%sn",strerror(errno)); break;
}
}
sleep(1);
}
}
}
这是输出
parent process
process child 1918 is runnig
child process
process child 1918 is runnig
child process
process child 1918 is runnig
child process
process child 1918 is runnig
child process
process child 1918 is runnig
child process
process child 1918 is runnig
process child 1918 is runnig
process child 1918 is runnig
process child 1918 is runnig
process child 1918 is runnig
在被杀死的子进程被wait()
收割之前,它的PID
仍然有效,并且kill(pid, 0);
会成功,因为PID
存在。代码尝试kill()
子进程,但无法为其wait()
。
请注意,即使在最好的情况下,kill(pid, 0);
也不可靠。由于只有 32766 个不同的 PID,进程 ID 很快就会被回收。
好吧,
我终于想通了
kill(pid,SIGTERM); //kills the child process
do
{
pid = waitpid(-1, NULL, WNOHANG);
if(pid == 0)
sleep(1);
}while(pid<=0);
相关文章:
- MPI:检查是否有任何进程已终止
- 以这种方式初始化的 char 数组是否会自动添加空终止符?
- 可变参数列表是否以空值终止?
- 是否有一种安全的方法可以断言字符串视图是否以 null 终止?
- 当加入 C++11 函数的线程仍未终止时,是否可以返回?
- 当可以返回错误/异常时,从库中终止调用程序(例如,调用exit())是否总是错误的?
- C++17 std::to_chars 是否在添加空终止符?
- 程序是否可以在调用kill函数之前返回/终止
- 插入没有空终止符空间的字符串是否安全?
- 对我是否需要一个哨兵值来终止我的 do while 循环以允许多个条目感到困惑
- 无法检测子进程是否已终止
- cin函数是否添加了在输入结束时终止的null
- 是否有一种方法可以在输入负数时平均不包括负数,这是您终止程序的方式
- 在动态内存分配中,在程序终止并且忘记释放内存后,该内存是否保持分配状态
- Boost.进程检查进程是否终止
- pclose() 返回管道的终止状态是否在所有平台上都向左移动了 8 位?
- 我是否应该在所有异常都导致终止的程序中使用异常处理
- 是否有任何 pthread 函数可以在最后一个线程终止时调用某些内容
- 如何编写代码来检查程序是否会终止
- Eclipse CDT——是否有一种方法可以在启动新启动之前终止之前正在运行的启动?