fork()执行过程

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

以下代码

#include  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你好世界

参数1是你好

分叉为循环增量1

争论2是世界

分叉为循环增量2

分叉为循环增量1

争论2是世界

分叉为循环增量2

分叉为循环增量2

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

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

调用fork的常用习惯是:

 pid_t pid = fork(); switch (pid) { case -1: /* an error occurred, ie 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(); } 

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

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

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

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

顺便说一句, 叉炸弹是最常见的DoS攻击之一:)