加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

获取特定PID的状态

发布时间:2020-12-16 03:41:34 所属栏目:百科 来源:网络整理
导读:简单的问题,但我还没有找到答案.给定一个特定的PID,我可以确定该过程是否有效?我正在研究一个C程序,这让我疯狂.我在某处读到了kill(pid,0)可以解决这个问题,但无论进程是否正在运行(或者看起来如此),都会返回0. 任何提示? 附加信息: 我感兴趣的过程是一个
简单的问题,但我还没有找到答案.给定一个特定的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.
     }
 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读