叉子究竟是如何工作的?
以下代码
#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你好世界 参数1是hello 分叉为循环增量1 论点2是世界 分叉为循环增量2 分叉为循环增量1 论点2是世界 分叉为循环增量2 分叉为循环增量2
一般情况下,首先执行的代码是什么。我想知道fork()的原理,而不是仅仅基于这个例子。我可以在命令行上有多个参数。
发布于 2011-02-15 22:42:07
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)语义完成,因此在其中一个进程开始为变量赋值之前,几乎没有任何实际的复制完成。
发布于 2011-02-15 22:54:26
请注意,进程数量将呈指数增长,因此对于100个参数,我们讨论的是1267650600228229401496703205376进程。我希望你有一个非常强大的PC :)。
我会在这里回答你的意见,它可能会帮助你理解叉子。
在每个循环之后,您将使进程的数量翻一番。因此,在N个循环之后,您将得到2^N进程。或者,经过100个循环,你就会得到我给你的那个大数字。
顺便说一句,叉式炸弹是最常见的DoS攻击之一:)
https://stackoverflow.com/questions/5010359
复制相似问题