叉错误?怎么修?

时间:2010-04-09 21:42:11

标签: c linux fork

此代码有什么问题?怎么解决?父进程转到if或子进程?

第一个代码生成僵尸进程或第二个代码或两者或非?

#include <signal.h>
#include <sys/wait.h>
main() {
  for (;;) {
    if (!fork()) {
      exit(0);
    }
    sleep(1);
  }
}

这段代码怎么样:

#include <signal.h>
#include <sys/wait.h>
main() {
  for (;;) {
    if (fork()) {
      exit(0);
    }
    sleep(1);
  }
}

6 个答案:

答案 0 :(得分:4)

  • 代码不是C99代码
  • 代码不包含正确的标题
  • 该代码每秒拨打一个孩子;孩子立即退出(表示成功)
  • 程序在被信号中断之前不会停止
  • 因为代码不等待它的子代,并且它不会忽略SIGCHLD信号,所以该过程会累积僵尸 - 只有在父母等待它们时才会被清理的进程。

    #include <stdlib.h>
    #include <unistd.h>
    int main(void)
    {
        for (;;)
        {
            if (fork() == 0)
                exit(0);
            sleep(1);
        }
        /* Unreached */
        return(0);
    }
    

替代代码成功地让父出口,而孩子进入休眠状态一秒钟,然后分叉并自杀(留下一个新的孩子继续这个过程)。

答案 1 :(得分:2)

我不知道问题是什么,因为我不知道你想要它做什么。它做的是分叉一个孩子,然后每秒退出(成功)。

当fork成功完成时,它会向子节点返回0,并将子节点的pid返回到父节点。因此,孩子在第一个程序中输入if主体,在第二个程序中输入父主。

第一个创建了无数个僵尸进程,因为父对象永远存在但永远不会等待。第二个不是因为父母立即退出,所以孩子是孤儿并被init采用。

编辑:解决更新问题。

答案 2 :(得分:1)

  

成功完成后,fork()   向子项返回值0   处理并返回进程ID   子进程到父进程   处理。否则,值为-1   返回父进程,没有   创建了子进程,并且   全局变量errno设置为indi-   提出错误。

该程序每秒创建子进程,立即退出。

换句话说,子进程“进入if”。您可以通过在if。

中添加printf语句来进行检查

答案 3 :(得分:1)

从命令行输入

man 2 fork

它会告诉你你想知道的一切。

答案 4 :(得分:0)

返回值

成功完成后,fork()将向子进程返回0,并将子进程的进程ID返回给父进程。两个进程都将继续从fork()函数执行。否则,-1应返回到父进程,不应创建子进程,并设置errno以指示错误。

=================

if (!fork()) equals to     if (0 == fork())

您的意思是什么,而不是在成功创建流程后创建流程?看起来像是一个问题...

答案 5 :(得分:0)

我可以建议您注释掉for循环并插入一些printf语句(或使用gdb逐步执行)。这将让您深入了解正在发生的事情。或者用以下内容绑定for循环:

int i = 0;
for ( i = 0; i < 5; i++ )

而不是使用无限循环,以便更容易理解/调试。

同时阅读fork()及其工作原理。那么你不仅能够回答这个问题,而且能够理解为什么这些答案适用,并且能够避免在你自己的软件中出错。

我建议保留睡眠声明。

我怀疑这个功课的重点是你通过修改它来了解它,并了解在你的系统上做什么和不安全。