日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

UNIX 進程揭秘( 二 )


p = fork();
if (p == 0) {
printf("In child process, pid=%d, ppid=%dn",
getpid(), getppid());
} else {
printf("In parent, pid=%d, fork returned=%dn",
getpid(), p);
}
}
sunbox$ gcc fork2.c -o fork2
sunbox$ ./fork2
Original program, pid=767
In child process, pid=768, ppid=767
In parent, pid=767, fork returned=768
清單 3 在每個步驟打印出 PID,并且該代碼檢查從 fork 返回的值來確定哪個進程是父進程,哪個進程是子進程 。對所打印的 PID 進行比較,可以看到原始進程是父進程 (PID 767),并且子進程 (PID 768) 知道其父進程是誰 。請注意子進程如何通過 getppid 來知道其父進程以及父進程如何使用 fork 來定位其子進程 。
現(xiàn)在您已經(jīng)了解了復制某個進程的方法,下面讓我們研究如何運行一個不同的進程 。fork 只是進程機制中的一半 。exec 系列系統(tǒng)調(diào)用運行實際的程序 。
使用 exec 系列系統(tǒng)調(diào)用
exec 的工作是將當前進程替換為一個新進程 。請注意“替換這個措詞的含義 。在您調(diào)用 exec 以后,當前進程就消失了,新進程就啟動了 。如果希望創(chuàng)建一個單獨的進程,您必須首先運行 fork,然后在子進程中執(zhí)行 (exec) 新的二進制文件 。清單 4 顯示了這樣一種情況 。
清單 4. 通過將 fork 與 exec 配合使用來運行不同的程序
sunbox$ cat exec1.c
#include
#include
int main (void) {
/* Define a null terminated array of the command to run
followed by any parameters, in this case none */
char *arg[] = { "/usr/bin/ls", 0 };
/* fork, and exec within child process */
if (fork() == 0) {
printf("In child process:n");
execv(arg[0], arg);
printf("I will never be calledn");
}
printf("Execution continues in parent processn");
}
sunbox$ gcc exec1.c -o exec1
sunbox$ ./exec1
In child process:
fork1.c exec1fork2exec1.c fork1
fork2.c 
Execution continues in parent process
清單 4 中的代碼首先定義一個數(shù)組,其中第一個元素是要執(zhí)行的二進制文件的路徑,其余元素充當命令行參數(shù) 。根據(jù)手冊頁的描述,該數(shù)組以 Null 結(jié)尾 。在從 fork 系統(tǒng)調(diào)用返回以后,將指示子進程執(zhí)行 (execv) 新的二進制文件 。
execv 調(diào)用首先取得一個指向要運行的二進制文件名稱的指針,然后取得一個指向您前面聲明的參數(shù)數(shù)組的指針 。該數(shù)組的第一個元素實際上是二進制文件的名稱,因此參數(shù)實際上是從第二個元素開始的 。請注意,該子進程一直沒有從 execv 調(diào)用返回 。這表明正在運行的進程已被新進程所替換 。
還存在其他執(zhí)行 (exec) 某個進程的系統(tǒng)調(diào)用,它們的區(qū)別在于接受參數(shù)的方式和是否需要傳遞環(huán)境變量 。execv(2) 是替換當前映像的較簡單方法之一,因為它不需要關(guān)于環(huán)境的信息,并且它使用以 Null 結(jié)尾的數(shù)組 。其他選項包括 execl(2)(它單獨接受各個參數(shù))或 execvp(2)(它也接受一個以 Null 結(jié)尾的環(huán)境變量數(shù)組) 。使問題復雜化的是,并非所有操作系統(tǒng)都支持所有變體 。關(guān)于使用哪一種變體的決定取決于平臺、編碼風格和是否需要定義任何環(huán)境變量 。
調(diào)用 fork 時,打開的文件會發(fā)生什么情況呢?
當某個進程復制它自身時,內(nèi)核生成所有打開的文件描述符的副本 。文件描述符是指向打開的文件或設(shè)備的整數(shù),并用于執(zhí)行讀取和寫入 。如果在調(diào)用 fork 前,某個程序已經(jīng)打開了一個文件,如果兩個進程都嘗試執(zhí)行讀取或?qū)懭耄瑫l(fā)生什么情況呢?一個進程會改寫另一個進程中的數(shù)據(jù)嗎?是否會讀取該文件的兩個副本?清單 5 對此進行了研究,它打開兩個文件——一個文件用于讀取,另一個文件用于寫入——并讓父進程和子進程同時執(zhí)行讀取和寫入 。

推薦閱讀