首页 > 解决方案 > 什么 execl ("/bin/emacs", "/etc/fstab"); 做?

问题描述

例如:

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,第一个分叉打印:

[1]
[1]

之后它再次分叉,所以你有 4 个进程和一个打印:

[2]
[2]
[2]
[2]

一个子进程有pid == 0. 有一个子进程pid1和一个子进程,pid2所以会有:

[3] 

来了execl。它在这一点上究竟做了什么?

标签: c++coperating-systemforkexecl

解决方案


这个问题引起了人们对 fork 新流程的关注,此外它还打算澄清工作是如何execl工作的。因此,它被声明为:

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

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

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

(取自execl文档

因此,这意味着您缺少一些论点。在这种情况下,您应该像这样使用它:

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

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


推荐阅读