首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >僵尸过程

僵尸过程
EN

Stack Overflow用户
提问于 2010-10-04 17:21:22
回答 4查看 18.1K关注 0票数 17

我想问一些关于僵尸过程的问题

  • 僵尸进程概念的好处是什么?
  • 知道内核为僵尸进程保留(PID、终止状态、资源使用信息)。

什么是“资源使用information"

  • how僵尸的PPID() =1,但它仍然是僵尸,(init获得僵尸,因为它默认等待())。”

任何一个人能写一些C代码来使一个僵尸--它的父代是Init吗?

  • 可以让僵尸拒绝释放一些内存锁吗??

提前感谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-04 18:15:58

-僵尸程序概念有什么好处?

僵尸进程只是pid、退出状态和一些会计信息,直到父进程使用wait系列的系统调用来获得其最终状态为止。在父进程调用wait之前,子进程ID必须保持标记为已使用,以便不能分配其他进程。如果另一个进程被分配了一个循环pid,那么很难区分它和以前具有相同pid的进程之间的区别。一旦父程序调用wait并返回最后的退出状态,就可以假设没有人会再次在这个pid上寻找子节点,因此pid现在可以被重用。(我认为在Linux上,如果父母离开SIGCHLD作为SIG_IGN,内核不会让僵尸出现,但是重新注册SIGCHLD作为SIG_IGN的配置不会产生同样的效果)

-知道内核为僵尸进程保留(PID、终止状态、资源使用信息)“资源使用信息”的含义

这些信息中有一些是运行程序的内容:

代码语言:javascript
复制
time my_program

会报告的。这些值通常在SIGCHLD的siginfo结构中报告(它不完全是对wait的调用),但也可以通过调用waitid形式的系统调用(在某些系统上)获得。有关此结构的信息,请参阅man sigaction

-僵尸的PPID() =1,它仍然是僵尸,(init获得僵尸,因为默认情况下它等待())

一个僵尸,其ppid =1不应该停留很长时间,因为它应该很快收获它。进程死后不久(通过exit或被杀死它的一手信号),它将一直是僵尸,直到它的父进程调用wait并获得它的最终状态。这意味着,即使init只做了一次又一次调用init,也可能会有一段很短的时间,进程可能会以僵尸的身份出现。如果进程作为init (0=ppid)的子进程出现很长一段时间(秒),那么某些事情可能是错误的。

--有人能写一些C代码让它的父母是Init的僵尸吗?

这还不清楚,但我认为你想:

代码语言:javascript
复制
pid_t f = fork();
if (f > 0) {
    exit(0); // this is the parent dying, so the child will be an orphan
             // and get adopted by init
} else if (f == 0) {
    sleep(100); // This is the child doing something that takes enough time for
                // its parent to commit suicide (exit(0)) and then for you to
                // observe that it has now been adopted by init
    exit(0);    // And now it dies as well, so init should reap its status, but
                // it may be a zombie for a short amount of time first.
} else /* error condition would be handled here */

-僵尸能拒绝释放一些记忆锁吗?

僵尸抓不住什么东西。他们失去了所有的内存页面,打开的文件句柄,...etc。几乎所有操作系统能够想出如何释放的东西都应该被释放。这将是一个错误,而不是,但请记住,操作系统必须知道,它是应该被释放的东西。在用户空间中创建资源是非常容易的,当程序死亡时,当操作系统不知道应该释放的程序时,这些资源应该被释放。

票数 16
EN

Stack Overflow用户

发布于 2010-10-04 17:34:00

僵尸进程纯粹是一个pid和退出状态值。pid不能释放,因为资源( pid)“属于”父进程。如果释放了它,另一个进程可能会得到相同的pid,然后父进程可能会向一个无关的进程发送信号;即使父进程首先等待确定子进程是否退出,也无法避免竞争条件。

票数 5
EN

Stack Overflow用户

发布于 2016-11-18 23:09:34

如果您对在正在运行的进程列表中看到僵尸进程感兴趣,请使用以下命令:

代码语言:javascript
复制
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
    pid_t p = fork();   // creates child process and stores the returned PID

    if (p != 0)         // executed by parent process
    {   sleep(1);       /* the child process terminates while the parent process sleeps,
                           the child then becomes a zombie process because the returned status
                           of the terminated child process isn't checked via a wait() */

        system("ps -eo pid,ppid,stat,cmd");  // prints a list of processes in your terminal

    }
    else        // executed by child process
    {
        exit(0);        // the child process terminates immediately
    }

    return 0;
}

您可以通过列表中的Z+识别僵尸进程:

注意:如果使用windows,则必须修改代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3857575

复制
相关文章

相似问题

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