2010-04-09 66 views
-4

这段代码有什么问题?如何解决它?父进程转到if或child进程?叉错误?怎么修?

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

#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); 
    } 
} 
+5

请不要只发布作业问题,并期望他们解决。尝试自己解决它们,然后在遇到困难时询问具体问题。 – danben 2010-04-09 21:54:02

+1

我的关于僵尸程序的问题产生了吗?以及哪个孩子或父母去分段 – SjB 2010-04-09 21:59:00

回答

0

返回值

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

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

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

什么你的意思是,成功创建不是创造了一个又流程?看起来像一个问题...

2

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

当fork成功完成时,它将0返回给子项,并将子项的pid返回给父项。因此,这是第一个程序中的if body和第二个程序中的父项。

第一个创建无限数量的僵尸进程,因为父母永远活着,但永远不会等待。第二种情况并不是因为父母立即退出,所以孩子是孤儿,并被init采纳。

编辑:解决问题的更新。

+1

我认为这个问题是一个作业问题,粗略地沿着“第一代码产生僵尸进程或第二代码或两者或非? – danben 2010-04-09 21:53:21

1

成功完成后,叉() 值0返回到子 过程和 子进程的进程ID返回给父 过程。否则,-1的值是 返回到父进程,否则 子进程创建,并且 全局变量errno设置为indi- 表明错误。

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

换言之,子进程“进入if”。您可以通过在if中添加printf语句来检查。

4
  • 的代码不是C99代码
  • 代码不包括正确的头
  • 代码叉一个孩子一次次;孩子立即退出(表示成功)
  • 该计划不会停止,直到通过信号
  • 中断由于代码不等待它的孩子,而且它不会忽略SIGCHLD信号,过程累积僵尸 - 流程如果只有他们的父母等待他们,这将被清理干净。

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

替代代码有父顺利退出,而孩子上睡了一秒钟,然后叉和自杀(留下一个新的子进程继续进行)。

+0

第一次制作僵尸还是第二?或两者 ?还是非? – SjB 2010-04-09 22:00:35

+0

@ sb2367:第一个代码产生僵尸,因为父母分出孩子并且永远不会等待他们。第二不产生僵尸;父进程死亡,'init'进程(PID = 1)收集死体(更准确地说,shell在死时收集原始父进程; init进程收集剩余的进程)。 – 2010-04-09 22:59:27

+0

我并不是想告诉你该怎么做,但我认为,当OP如此公然地寻找答案时,他可以在不必阅读或理解的情况下写下来并接通,这不符合SO的精神放纵他。 – danben 2010-04-09 23:14:22

0

我可以建议你注释掉for循环并插入几条printf语句(或者用gdb逐句)。这会让你了解发生了什么。或者用类似的方法绑定for循环:

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

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

也读了fork()以及它是如何工作的。然后,您不仅能够回答这个问题,还能理解这些答案为什么适用,并且能够避免在自己的软件中犯错误。

我会建议离开睡眠声明。

我怀疑这个作业的重点在于,您可以通过修改它并了解您的系统上做什么和不做什么是安全的。

1

从您的命令行中键入

man 2 fork 

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

相关问题