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

UNIX 進程揭秘( 三 )


清單 5. 同時對同一文件執(zhí)行讀取和寫入的兩個進程
#include
#include
#include
#include
#include
#include
int main(void) {
int fd_in, fd_out;
char buf[1024];
memset(buf, 0, 1024); /* clear buffer*/
fd_in = open("/tmp/infile", O_RDONLY);
fd_out = open("/tmp/outfile", O_WRONLY|O_CREAT);
fork(); /* It doesn't matter about child vs parent */
while (read(fd_in, buf, 2) > 0) { /* Loop through the infile */
printf("%d: %s", getpid(), buf);
/* Write a line */
sprintf(buf, "%d Hello, world!nr", getpid());
write(fd_out, buf, strlen(buf));
sleep(1);
memset(buf, 0, 1024); /* clear buffer*/
}
sleep(10);
}
sunbox$ gcc fdtest1.c -o fdtest1
sunbox$ ./fdtest1
2875: 1
2874: 2
2875: 3
2874: 4
2875: 5
2874: 6
2874: 7
sunbox$ cat /tmp/outfile
2875 Hello, world!
2874 Hello, world!
2875 Hello, world!
2874 Hello, world!
2875 Hello, world!
2874 Hello, world!
2874 Hello, world!
清單 5 是用于打開文件的簡單程序,并派生 (fork) 為父進程和子進程 。每個進程從同一文件描述符(它只是一個包含數(shù)字 1 至 7 的文本文件)執(zhí)行讀取操作,并連同 PID 一起打印所讀取的內(nèi)容 。在讀取一行之后,將 PID 寫到輸出文件 。當(dāng)輸入文件中沒有其他字符可供讀取時,循環(huán)結(jié)束 。
清單 5 的輸出表明,當(dāng)一個進程從該文件讀取時,兩個進程的文件指針都在移動 。同樣地,當(dāng)向某個文件寫入時,下一個字符被寫到文件結(jié)尾 。這是非常有意義的,因為內(nèi)核跟蹤打開文件的信息 。文件描述符只不過是進程的標(biāo)識符 。
您可能還知道,標(biāo)準(zhǔn)輸出(屏幕)也是一個文件描述符 。此文件描述符在 fork 調(diào)用期間被復(fù)制,這就是兩個進程都能對屏幕執(zhí)行寫入操作的原因 。
父進程或子進程的終止
進程必須在某個時候終止 。問題只是哪個進程首先終止:父進程還是子進程 。
父進程在子進程之前終止
如果父進程在子進程之前終止,孤立的子進程需要知道它們的父進程是誰 。記住,每個進程都有父進程,并且您可以跟蹤從每個子進程一直到 PID 1(或稱為 init)的整個進程家族樹 。當(dāng)某個父進程終止時,init 將接納所有子進程,如清單 6 所示 。
清單 6. 在子進程之前終止的父進程
#include
#include
int main(void) {
int i;
if (fork()) {
/* Parent */
sleep(2);
_exit(0);
}
for (i=0; i < 5; i) {
printf("My parent is %dn", getppid());
sleep(1);
}
}
sunbox$ gcc dIE1.c -o die1
sunbox$ ./die1
My parent is 2920
My parent is 2920
sunbox$ My parent is 1
My parent is 1
My parent is 1
在此例中,父進程調(diào)用 fork,等待兩秒鐘,然后退出 。子進程在五秒鐘內(nèi)繼續(xù)打印其父 PID ??梢钥吹?,PPID 在父進程終止后更改為 1 。Shell 提示符的返回也是非常有趣的 。由于子進程在后臺運行,父進程一終止,控制即返回到 Shell 。
子進程在父進程之前終止
清單 7 與清單 6 相反——即在父進程之前終止的子進程 。為更好地說明所發(fā)生的事情,進程本身中沒有打印任何內(nèi)容 。而有趣的信息來自于進程清單 。
清單 7. 子進程在父進程之前終止
sunbox$ cat dIE2.c
#include
#include
int main(void) {
int i;
if (!fork()) {
/* Child exits immediately*/
_exit(0);
}
/* Parent waits around for a minute */
sleep(60);
}
sunbox$ gcc die2.c -o die2
sunbox$ ./die2 &
[1] 2934
sunbox$ ps -ef | grep 2934

推薦閱讀