在网上找到这个例子,但无法找出为什么不打印这条线
#include<stdlib.h>
#include<unistd.h>
int main()
{
pid_t return_value;
printf("Forking process\n");
return_value=fork();
printf("The process id is %d
and return value is %d\n",
getpid(), return_value);
execl("/bin/ls/","ls","-l",NULL);
printf("This line is not printed\n");
}
答案 0 :(得分:5)
成功execl
永不返回,请参阅man page:
exec()函数仅在发生错误时返回。
相反,主机进程将替换为您exec
的内容,在本例中为ls
进程映像:
exec()系列函数用新的过程映像替换当前过程映像。
这样,你的程序将在到达最后一个printf
语句之前在内存中被替换,导致它永远不会执行。
答案 1 :(得分:1)
exec*()
函数在某种意义上是特殊的,它们不返回。该函数的典型实现“替换”当前进程的模块,其实际上与当前进程内部的新程序的启动相同。在您的情况下,新程序为/bin/ls
。在execl()
期间,所有先前的图像都从进程中卸载,然后加载/bin/ls
及其所有依赖项,并将控制权传递给调用其/bin/ls
函数的main()
的入口点,等等。
因此,在execl()
之后没有地方可以返回控制,因为在当前进程的地址空间中不再存在调用它的模块。