execlp() 系统调用是如何工作的?

15
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

int main(){
pid_t pid;
pid = fork();
if(pid<0){
   fprintf(stderr, "fork failed");
   return 1;    }
else if(pid == 0){  
   execlp("bin/ls", "ls", NULL);}
else{
   wait(NULL);
   printf("child complete\n");
   }
return 0;
}

据我理解,这里创建了一个子进程,由于fork返回的pid为“0”,它进入包含execlp语句的块并执行它,然后父进程等待子进程退出,然后输出“child complete”。如果我理解有误,请纠正我。但我不明白execlp()在这里是如何工作的。能否有人解释一下?

2个回答

33

fork 创建一个新的进程,在父进程中被调用一次,但在子进程和父进程都会返回两次。

在子进程中,调用 execlp 执行指定的命令 ls

这将使用新程序文件(ls 程序文件)替换子进程,意味着以下内容:

当进程调用 execlp 或其他 7个 exec 函数之一时,该进程被新程序完全替换,并在其主函数处开始执行新程序。

exec 不会创建新的进程,因此进程 ID 在 exec 过程中不会发生改变。它只是从磁盘中用全新的程序替换当前进程的文本、数据、堆和栈段。

在某些操作系统中,fork 跟随 exec 的组合称为“生成新进程”。

希望以上内容比较清晰易懂。如果您有更多问题,请告诉我。


谢谢您提供这么好的帮助和回答。 :) - Nikhil
但是在运行此程序后,所有目录内容都应该被发布(这就是 ls 所做的),但实际上只发布了 child complete - Nitin Aggarwal
@NitinAggarwal,原帖代码有错别字,请修正为execlp("/bin/ls", "ls", NULL);} - deimus

1

exec()函数族可以用来替换当前进程映像为新的进程映像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接