Linux中的execl函数c

时间:2017-02-16 03:22:57

标签: c linux exec

我开始了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;
}

1 个答案:

答案 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