首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分叉()执行过程

分叉()执行过程
EN

Stack Overflow用户
提问于 2011-02-15 22:38:54
回答 2查看 5.3K关注 0票数 6

叉子究竟是如何工作的?

以下代码

代码语言:javascript
复制
#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()的原理,而不是仅仅基于这个例子。我可以在命令行上有多个参数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-15 22:42:07

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

调用fork的常用成语是:

代码语言:javascript
复制
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)语义完成,因此在其中一个进程开始为变量赋值之前,几乎没有任何实际的复制完成。

票数 9
EN

Stack Overflow用户

发布于 2011-02-15 22:54:26

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

我会在这里回答你的意见,它可能会帮助你理解叉子。

在每个循环之后,您将使进程的数量翻一番。因此,在N个循环之后,您将得到2^N进程。或者,经过100个循环,你就会得到我给你的那个大数字。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5010359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档