2014-09-23 36 views
6
#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的塊並執行它,然後父級等待,直到子進出並然後打印「孩子完成」。如果我錯了,請糾正我。但我不明白execlp()如何在這裏工作。有人可以解釋這個嗎?execlp()系統調用如何工作?

回答

13

fork創建一個新進程,它由父級調用一次,但在父級和子級中返回兩次。

在子進程中,調用execlp執行指定的命令ls

這將用新程序文件(ls程序文件)替換子進程,這意味着以下內容。

當進程調用execlp或其他功能之一時,該進程完全被新程序替換,並且新程序在其主要功能 處開始執行。

進程ID不會在exec之間更改,因爲創建的新進程不是 。 exec只是用磁盤上的全新程序替換當前進程的文本,數據,堆以及堆棧段 。

在某些操作系統上,fork後跟exec的組合稱爲spawning a new process

希望它或多或少清楚。如果您有更多問題,請告訴我。

+0

謝謝你一個很好的和有益的答案。 :) – Nikhil 2016-09-23 20:42:37

0

exec()系列函數用 替換當前過程映像的新過程映像。