【发布时间】:2019-06-20 14:56:56
【问题描述】:
例如:
int pid1 = fork();
printf("%s\n", "[1]");
int pid2 = fork();
printf("%s\n", "[2]");
if ((pid1 == 0) && (pid2 == 0)) {
printf("%s\n", "[3]");
execl("/bin/emacs", "/etc/fstab");
int pid3 = fork();
printf("%s\n", "[4]");
} else {
printf("%s\n", "[5]");
}
这条线实际上是做什么的?
execl系列函数用新的过程映像替换当前过程映像。
所以这个程序启动了,让我们运行一下程序:
它将进程分成2个,第一个fork打印:
[1]
[1]
然后它再次分叉,所以你有 4 个进程和一个打印:
[2]
[2]
[2]
[2]
子进程有pid == 0。有一个带有pid1 的子进程和一个带有pid2 的子进程,所以会有:
[3]
execl 来了。它在这一点上究竟做了什么?
【问题讨论】:
-
主进程:2 个分叉,打印
[1] [2] [5],子进程 1(来自主):1 个分叉,打印[1] [2] [5],子进程 2(来自主):0 个分叉,打印[2] [5],子进程3(来自子进程1):1个fork,打印[2] [3]然后用另一个程序覆盖进程。 IE。pid3 = fork()永远不会被执行,你也永远不会看到[4]。 -
维基百科exec (system call):“...在已经存在的进程的上下文中运行一个可执行文件,替换之前的可执行文件”,即原程序中
exec()之后的任何代码都是死代码. -
我推荐阅读Lions' Commentary on UNIX 6th Edition, with Source Code。在那里,您可以逐步遵循 exec() 的操作(在第 12-3 节,第 3020 行)。
标签: c++ c operating-system fork execl