execl是什么(“ / bin / emacs”,“ / etc / fstab”);做?

时间:2019-01-27 11:59:19

标签: c++ c operating-system fork execl

例如:

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函数家族将新的过程映像替换为当前过程映像。

因此,该程序启动,只需运行该程序即可:

它将首先将打印分叉到两个进程中:

[1]
[1]

然后再次进行分叉,因此您有4个进程和一个打印件:

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

子进程具有pid == 0pid1有一个子进程,而pid2有一个子进程,因此完全有:

[3] 

execl来了。此时,它到底是做什么的?

1 个答案:

答案 0 :(得分:0)

该问题引起人们的注意,除了试图阐明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);

此调用应以参数emacs开始/etc/fstab编辑器-这意味着emacs编辑器将被打开(如果已安装),其内容为{{1 }}。