首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取特定PID的状态。

获取特定PID的状态。
EN

Stack Overflow用户
提问于 2014-01-08 15:05:48
回答 5查看 27.2K关注 0票数 10

问题很简单,但我还没有找到答案。给定一个特定的PID,我能否确定该进程是否处于活动状态?我在做一个C程序,这让我发疯了。我在某个地方读到了kill(pid,0)可以做到这一点,但是不管进程是否正在运行(或者看起来是这样),它都会返回0。

有什么暗示吗?

附加信息:我感兴趣的过程是一个由fork()发起的子程序。子进程应该在到达语句exit(0).时终止--至少这正是我所期望的.显然不是。

更多信息:使用fork()创建的子进程执行一个系统命令,该命令可以根据最终用户的不同而有所不同。整个过程是一个批处理过程的一部分,所以没有机会跳进去修复一些东西。这个子进程可能必须执行的任务之一是建立到远程服务器的连接,以便在那里存储一些文档。这可能是另一台Linux机器,也可能是Win Server (或者其他什么东西)。因此,我不想等待子进程。我希望父进程等待一段特定的时间(例如10秒),然后如果其子进程到那时还没有完成,就关闭它。同样,如果子进程在3毫秒内完成任务,我不希望父进程等待10秒。

看来我不是第一个遇到这个问题的人。

EN

回答 5

Stack Overflow用户

发布于 2014-01-08 15:07:09

您正在寻找侍候,它将返回给定PID的状态信息。

对于不相关的进程,您可以在linux中使用/proc/[pid]/stat并读取输出。

关于更新信息的

海事组织有两种情况。

第一:

子进程很快就完成了。使用WNOHANG(与WNOHANG一起使用)并获得它的状态,然后您就知道它是如何终止的,它实际上是如何终止的。

第二:

子进程正在运行。在WNOHANG中使用WNOHANG并检查它是否仍在运行。如果不做父母需要做的任何事情,在足够的时间过去之后,并且子程序仍然运行,您可以关闭它,或者做任何您认为合适的设计,作为适当的响应。

无论哪种方式,等待都是你需要的。伪代码只是演示,你可以在中间做其他的事情,你不需要等待10秒,即使孩子被提前结束,bec,因为像这样的轮询是不合适的。

psuedocode:

代码语言:javascript
复制
 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.
     }
 }
票数 5
EN

Stack Overflow用户

发布于 2014-01-08 15:23:53

Linux不会删除终止后的进程描述符,因为父母稍后可能需要他们的信息。只有在父程序发出wait()-like系统调用时,Linux才会完全删除它们。通常这是由它的父亲完成的,但是如果这个进程是孤儿,它就变成了init的子进程,而init最终会发出wait()-like系统调用来杀死僵尸进程。

话虽如此,在父亲发出wait()-like调用之前,子进程描述符仍然分配有EXIT_ZOMBIE状态。这就是为什么kill(pid, 0)工作正常的原因。它能够用pid字段找到进程描述符。

man 3 exit进一步扩展了这一点,并解释了与wait(2)和僵尸进程的关系。

关于kill(pid, 0)。它可以用来判断进程是否存在,但它并不告诉您是否正在运行或等待父进程发出wait()系统调用来从内核的内存中清除进程。

如果存在,kill()将返回0。如果没有,则-1将返回正确的errno集(ESRCH)。如果您分叉一个进程,而父进程存在,则它有责任发出一个wait()来获取其子女的终止信息。如果没有,孩子们就会四处游荡,直到父亲去世。

想确认一下吗?找出子(据称)僵尸的pid,并发出以下命令:

代码语言:javascript
复制
cat /proc/[pid]/status | grep "State"

它应该显示僵尸的Z (man 5 proc)。

希望这能有所帮助!

票数 3
EN

Stack Overflow用户

发布于 2014-01-08 16:05:38

如果我理解这个问题

  1. 在父类中建立信号处理程序。SIGCHLD的默认设置是忽略它,但是通过设置处理程序,信号将在子进程完成时传递给父进程。当它完成时,可以使用waitwaitpid来获取它,无论哪种方法真正适合您的需要。您不需要以这种方式进行不必要的wait或重复投票(waitpid)。
  2. 设置一个定时器(例如itimertimer_createalarm等)。如果计时器在子程序完成之前就结束了,那么kill它。如果孩子先完成,关闭计时器。有明显的(但不可避免的)比赛条件,但没有什么特别复杂的处理。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20999255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档