【问题标题】:What does execl ("/bin/emacs", "/etc/fstab"); do?什么 execl ("/bin/emacs", "/etc/fstab");做?
【发布时间】: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


【解决方案1】:

这个问题引起了人们对 fork 新进程的关注,此外它还打算澄清execl 的工作原理。所以,它被声明为:

int execl(const char *path, const char *arg, ...);

其中是 sh 实用程序的未指定路径名,file 是进程映像文件,对于 execvp(),其中 arg0、arg1 等对应于 argv[0]、argv 中传递给 execvp() 的值1,等等。

由 arg0,... 表示的参数是指向以空字符结尾的字符串的指针。这些字符串应构成新过程映像可用的参数列表。该列表由一个空指针终止。参数 arg0 应指向一个文件名字符串,该字符串与由 exec 函数之一启动的进程相关联。

(取自execl documentation

所以,这意味着您缺少一些参数。在这种情况下,您应该像这样使用它:

execl("/bin/emacs", "/bin/emacs", "/etc/fstab", (char*)NULL);

此调用应以 /etc/fstab 参数启动 emacs 编辑器 - 这意味着将打开(如果已安装)emacs 编辑器,其中包含位于 /etc/ 中的 fstab 文件的内容。

【讨论】:

  • 您误读了您的来源。执行是'好像'你所说的是指定的。
  • 字符串 /etc/fstab 是 emacs 的参数,而不是程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 2021-09-21
相关资源
最近更新 更多