fork()执行过程

jar*_*ryd 6 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;
}
Run Code Online (Sandbox Code Playgroud)

给出以下输出

/a.out你好世界

参数1是你好

分叉为循环增量1

争论2是世界

分叉为循环增量2

分叉为循环增量1

争论2是世界

分叉为循环增量2

分叉为循环增量2

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

Fre*_*Foo 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();
}
Run Code Online (Sandbox Code Playgroud)

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

  • 程序中的输出顺序是不确定的.循环中的`fork`并不是那么奇怪(你可能想创建一些*n*个工作进程),但是一个简单的`fork`,其中child和parent运行相同的代码是非常罕见的.大多数时候,`fork`只是准备调用`exec`. (2认同)