我开始了Linux内部概念。在以下程序中,为什么不执行第二个printf
?
#include <unistd.h>
#include <stdio.h>
int main(void) {
printf("Before execl");
execl("/bin/ls", "ls", "-l", NULL);
printf("After execl");
return 0;
}
答案 0 :(得分:2)
第二个printf
未执行,因为execl
接管应用程序的进程并将其替换为新指定的进程。根据手册页:
exec()系列函数用新的过程映像替换当前过程映像。本手册页中描述的功能是execve(2)的前端。 (有关更换当前过程映像的更多详细信息,请参见execve(2)的手册页。)
来自execve(2)
手册页:
execve()在成功时不返回,并且调用进程的text,data,bss和stack将被加载的程序覆盖。如果正在运行当前程序,则在成功执行execve()后会向其发送SIGTRAP。
如果您希望程序继续执行并显示第二个printf
,则必须在{{1}内调用execl
(或exec
系列中的任何函数)孩子。 C标准库函数fork
就是这样做的,您可以查看源代码here。