为什么不打印这条线? (C ++线程)

时间:2016-09-12 07:19:26

标签: c++ multithreading

在网上找到这个例子,但无法找出为什么不打印这条线

#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");
}

2 个答案:

答案 0 :(得分:5)

成功execl永不返回,请参阅man page

  

exec()函数仅在发生错误时返回。

相反,主机进程将替换为您exec的内容,在本例中为ls进程映像:

  

exec()系列函数用新的过程映像替换当前过程映像。

这样,你的程序将在到达最后一个printf语句之前在内存中被替换,导致它永远不会执行。

答案 1 :(得分:1)

exec*()函数在某种意义上是特殊的,它们不返回。该函数的典型实现“替换”当前进程的模块,其实际上与当前进程内部的新程序的启动相同。在您的情况下,新程序为/bin/ls。在execl()期间,所有先前的图像都从进程中卸载,然后加载/bin/ls及其所有依赖项,并将控制权传递给调用其/bin/ls函数的main()的入口点,等等。

因此,在execl()之后没有地方可以返回控制,因为在当前进程的地址空间中不再存在调用它的模块。

相关问题