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()的原理,而不是仅仅基于这个例子.我可以在命令行上有多个参数.
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)语义来完成,因此在其中一个进程开始分配变量之前几乎不会进行任何实际复制.