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()的原理,而不是仅仅基于这个例子。我可以在命令行上有多个参数。
答案 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攻击之一:)