fork程式設計之exec函式詳解

2021-07-16 03:46:37 字數 2522 閱讀 1645

基本概念:

用fork函式建立新的子程序後,子程序往往要呼叫一種exec函式以執行另乙個程式。當程序呼叫一種exec函式時,該程序執行的程式完全替換為新程式,而新程式則從其main函式開始執行。因為呼叫exec並不建立新程序,所以前後的程序id並未改變。exec只是用磁碟上的乙個新程式替換了當前程序的正文段、資料段、堆段和棧段。

系統呼叫:

execve(2)                  linux programmer's manual                 execve(2)

name

execve - execute program

synopsis

#include int execve(const char *filename, char *const argv,

char *const envp);

其他函式族:

exec(3)                    linux programmer's manual                   exec(3)

name

execl, execlp, execle, execv, execvp, execvpe - execute a file

synopsis

#include extern char **environ;

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char *path, const char *arg,

..., char * const envp);

int execv(const char *path, char *const argv);

int execvp(const char *file, char *const argv);

int execvpe(const char *file, char *const argv,

char *const envp);

在執行exec後,程序id沒有改變。但新程式從呼叫程序繼承了下列屬性:1.程序id和父程序id

2.實際使用者id和實際組id

3.附屬組id

4.程序組id

5.會話id

6.控制終端

7.鬧鐘尚預留時間

8.當前工作目錄

9.根目錄

10.檔案模式建立遮蔽字

11.檔案鎖

12.程序訊號遮蔽

13.未處理訊號

14.資源限制

15.nice值

16.tms_utime、tms_stime、tms_cutime、tms_cstime值

例子:

被執行的新程式:

------ gcc printf.c -o printf -----

#include #include int main()

return 0;

}

主程式:----- gcc execve.c -----

#include #include #include void perror(const char *s)

int main()

else if (pid == 0) else if (pid > 0)

sleep(2);

printf("second child pid = %ld, parent pid = %ld\n",

(long)getpid(), (long)getppid());

if (execve("printf", null, null) == -1) /* 程式的路徑要絕對路徑或者相對路徑 */

perror("execl error");

exit(0);

}if (waitpid(pid, null, 0) != pid) /* wait for first child */

perror("waitpid error");

printf("parent for first child exit\n");

return 0;

}

執行:./a.out

執行結果:

ps:更好的辦法是用system函式

fork函式 exec函式

fork 會產生乙個和父程序完全相同的子程序,出於效率考慮,linux中引入了 寫時複製 技術,也就是只有程序空間的各段的內容要發生變化時,才會將父程序的內容複製乙份給子程序。在fork之後exec之前兩個程序用的是相同的物理空間 記憶體區 子程序的 段 資料段 堆疊都是指向父程序的物理空間,也就是...

Linux程式設計之fork

fork 建立乙個子程序 建立失敗返回負值 同時會有不同的錯誤碼 errno eagain 系統程序個數限制 enomem 申請記憶體失敗 enosys 系統平台不支援 建立成功將會返回兩個值 0 子程序的返回值,說明當前程式在子程序執行 0 父程序的返回值,說明當前程式在父程序執行,返回值為生成子...

exec族函式配合fork函式使用

檔案demo.c include include include include include include include intmain if pid 0 else return0 檔案changdata.c include include include include include i...