例如:
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 == 0
。 pid1
有一个子进程,而pid2
有一个子进程,因此完全有:
[3]
execl
来了。此时,它到底是做什么的?
答案 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("/bin/emacs", "/bin/emacs", "/etc/fstab", (char*)NULL);
此调用应以参数emacs
开始/etc/fstab
编辑器-这意味着emacs
编辑器将被打开(如果已安装),其内容为{{1 }}。