fork()执行过程

时间:2011-02-15 22:38:54

标签: c fork

fork()究竟是如何工作的?

以下代码

#include <stdio.h>

int main (int argc, char const *argv[])
{
printf("Hi\n");
int i;
for(i = 1; i < argc; i++)
{
    printf("Argument %d is %s\n", i, argv[i]);
    fork();
    printf("Forked in for loop increment %d\n", i);
}


return 0;
}

给出以下输出

  

/a.out hello world

     

参数1是你好

     

分配为循环增量1

     

论据2是世界

     

分配为循环增量2

     

分配为循环增量1

     

论据2是世界

     

分配为循环增量2

     

分配为循环增量2

一般来说,fork首先执行什么代码。我想知道fork()的原理,而不是仅仅基于这个例子。我可以在命令行上有多个参数。

2 个答案:

答案 0 :(得分:9)

fork是一个系统调用,即调用内核的库例程。在为fork调用提供服务时,内核会创建一个新进程,该进程执行与调用它的进程相同的程序。新进程开始执行,好像已调用fork;返回值与父级中的值不同,因此您可以区分这两者。

调用fork的常用习惯是:

pid_t pid = fork();

switch (pid) {
  case -1:
    /* an error occurred, i.e. no child process created */
    handle_error();
  case 0:
    /* a return value of 0 means we're in the child process */
    do_child_stuff();
    break;  // or _exit()
  default:
    /* we're in the parent; pid is the child's process id */
    do_parent_stuff();
}

这是如何工作的:操作系统制作了一个近乎完美的进程调用fork的副本(PID和其他一些值是不同的,但内存内容实际上是从相同,通常在两个文件中都打开相同的文件。副本通常使用所谓的写时复制(COW)语义来完成,因此在其中一个进程开始分配变量之前几乎没有任何实际的复制。

答案 1 :(得分:3)

请注意,进程数量将呈指数级增长,因此对于100个参数,我们正在讨论1267650600228229401496703205376进程。我希望你有一台非常强大的PC:)。

我会在这里回答你的评论,它可能会帮助你理解分叉。

每次循环后,您将使进程数增加一倍。因此,在N循环之后,您将最终得到2 ^ N的过程。或者在100次循环之后,你将得到我给你的那么大的数字。

顺便说一下,fork bombs是最常见的DoS攻击之一:)