简单的问题,但我还没有找到答案.给定一个特定的PID,我可以确定该过程是否有效?我正在研究一个C程序,这让我疯狂.我在某处读到了kill(pid,0)可以解决这个问题,但无论进程是否正在运行(或者看起来如此),都会返回0.
任何提示?
附加信息:
我感兴趣的过程是一个由fork()启动的子进程.
子进程应在到达语句exit(0)时终止.至少那是我的预期……显然它没有.
更多信息:
使用fork()创建的子进程执行系统命令,该命令可能因最终用户而异.整个过程是批处理过程的一部分,因此没有机会进入并修复某些东西.此子进程可能必须执行的任务之一是建立与远程服务器的连接,以便在那里存储一些文档.这可能是另一台Linux机器,也可能是Win Server(或其他可能的东西).出于这个原因,我不想等待子进程.我希望父母等待一段特定的时间(例如10秒)然后杀死子进程,如果它还没有完成的话.出于同样的原因,如果孩子在3毫秒内完成任务,我不希望父进程等待10秒.
看来我不是第一个遇到这个问题的人.
解决方法
您正在寻找
waitpid,它将返回给定PID的状态信息.
对于不相关的进程,您可以在linux中使用/ proc / [pid] / stat并读取输出.
关于更新的信息
IMO有两种情况.
第一:
子进程很快就完成了.使用waitpid(使用WNOHANG)并获取它的状态,然后你知道它是如何终止的并且它实际终止了.
第二:
子进程正在运行.将waitpid与WNOHANG一起使用并检查它是否仍在运行.如果没有做父母需要做的其他事情,经过足够的时间,孩子仍然跑,你可以杀死它,或做任何你的设计认为合适的反应.
无论哪种方式,waitpid正是您所需要的.伪代码只是证明,你可以在其间做其他事情,即使孩子提前终止你也不需要等待10秒,因为这样的轮询不合适.
伪代码:
pid_t pid; pid = fork(); while(1) { if(pid == 0) { if(status = waitpid(pid,WNOHANG)) { if(status != exited) { if(checkExpiryTime() == true) kill(pid,SIGKILL); else sleep(x); // or whatever is appropriate in your case. } } } else { // do childstuff here. } }