基本概念:
用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...