这个C代码可以创建僵尸进程吗?

时间:2013-12-15 19:34:21

标签: c process pid zombie-process waitpid

我想知道以下代码是否可以创建僵尸:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(){
    int i=1;
    pid_t p;
    p = fork();
    i++;
    if(p!=0){
        waitpid(p, NULL, 0);
    }
    printf("%d\n",i);
    return 0;
}

因此,父进程调用子进程的waitpid,如果子进程尚未退出,则立即返回。所以,到目前为止,没有僵尸可以出现。但是,如果孩子在

return 0;
命令之前退出,那么这将是一个僵尸呢?我其实很困惑。在程序终止之前,waitpid应该是最后一行代码吗?任何帮助,将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:6)

只要 ,只要本身存在,父母就不会致电wait*() ,孩子只会变成僵尸。

在父母也结束的那一刻,孩子被init过程所收获,这个过程会小心地给孩子打电话wait*(),所以它最终会结束,然后离开僵尸状态从进程列表中消失。

要激活在您的示例代码中创建的子代变为僵尸修改代码,例如如下:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void) 
{
    pid_t p = fork();

    if (p != 0) 
    {
        waitpid(p, NULL, 0); /* See if the child already had ended. */
        sleep(1); /* Wait 1 seconds for the child to end. And eat away the SIGCHLD in case if arrived. */
        pause(); /* Suspend main task. */
    }
    else
    {
        sleep(3); /* Just let the child live for some tme before becoming a zombie. */
    }

    return 0;
}

由于以下两个事实:

  • 孩子睡了3秒,所以父母对waitpid()的呼叫最有可能总是失败
  • SIGCHLD的默认处理是忽略它。

上面的代码实际上与:

相同
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void) 
{
    pid_t p = fork();

    if (p != 0) 
    {
        pause(); /* Suspend main task. */
    }
    else
    {
        sleep(3); /* Just let the child live for some tme before becoming a zombie. */
    }

    return 0;
}

答案 1 :(得分:0)

我找到了一种创建僵尸进程并使用ps -e

进行测试的简单方法
DataGrid

在15秒内运行ps -e ... 你会看到

6454 pts / 2 00:00:00 a.out&lt;已解散&gt;