程序之wait waitpid使用

2021-09-30 00:09:06 字數 4361 閱讀 7834

上個部落格講了如何使用fork簡單的建立乙個新的程序,本篇文章將講下如何避免殭屍程序的產生,殭屍程序的產生就是因為子程序退出時沒有父程序替它"收屍"即沒有獲取子程序的狀態資訊,一般我們可以使用wait或者waitpid函式來進行處理

下面的**示例演示了子程序如何成為殭屍程序的過程

#include #include #include void main(void)

else if (0 == pid)

else }

return;

}

執行結果:4160的子程序4161成為了z程序即殭屍程序

mcchen@mcchen-virtual-machine:/home/samba/share/mywork/test/wait$ sudo gcc -o wait wait.c 

mcchen@mcchen-virtual-machine:/home/samba/share/mywork/test/wait$ ./wait

i am parent process pid = 4160

i am child process pid = 4161

child process exit...

mcchen@mcchen-virtual-machine:/home/samba/share/mywork/test/wait$ ps

pid tty time cmd

3736 pts/4 00:00:00 bash

4160 pts/4 00:00:00 wait

4161 pts/4 00:00:00 wait mcchen@mcchen-virtual-machine:/proc/4160$ cd ../4161

mcchen@mcchen-virtual-machine:/proc/4161$ cat status

name: wait

state: z (zombie)

tgid: 4161

ngid: 0

pid: 4161

ppid: 4160

tracerpid: 0

uid: 1000 1000 1000 1000

gid: 1000 1000 1000 1000

下面將使用wait函式來獲得子程序的狀態

#include #include #include #include void main(void)

else if (0 == pid)

else }

return;

}

下面的結果顯示,子程序11633正常退出,並且狀態資訊被父程序11632捕捉,這時就不會成為殭屍程序

mcchen@mcchen-virtual-machine:/home/samba/share/mywork/test/wait$

i am parent process pid = 11632

i am child process pid = 11633

child process exit...

pid = 11633 has exit

mcchen@mcchen-virtual-machine:/home/samba/share/mywork/test/wait$ ps

pid tty time cmd

3736 pts/4 00:00:00 bash

11632 pts/4 00:00:00 wait

11638 pts/4 00:00:00 ps

下面的例項演示了和wait相關的三個獲取終止狀態的函式

wifexited(status) :若為正常終止子程序返回的狀態,則為真,使用wexitstatus(status)來獲取狀態

wifsignaled(status) :若為異常終止子程序返回的狀態,則為真,對於這種情況,可執行wtermsig(status)獲取使子程序終止的訊號編號

wifstopped(status) :若為當前暫停子程序的返回的狀態,則為真,對於這種情況,可執行wstopsig(status)獲取使子程序暫停的訊號編號

#include #include #include #include #include void main(void)

else if (0 == pid)

else

else if (wifsignaled(statloc))

else if (wifstopped(statloc))

printf("pid = %ld has exit\n", (long)pid);

while(1)

}return;

}

正常return返回的和傳送訊號導致異常返回的結果不一樣,如下

//正常使用return 或者exit返回的結果

mcchen@mcchen-virtual-machine:/home/samba/share/mywork/test/wait$

i am parent process pid = 12570

i am child process pid = 12571

child process exit...

normal termination, exit status = 0

pid = 12571 has exit

//使用abort終止程序函式,或者其它程序傳送訊號終止的結果

mcchen@mcchen-virtual-machine:/home/samba/share/mywork/test/wait$

i am parent process pid = 12580

i am child process pid = 12581

child process exit...

abnormal termination, signal number = 134

pid = 12581 has exit

上面講的可以使用wait等待子程序的狀態資訊避免殭屍程序的產生,還有另一種方式就是父程序在子程序退出前先退出,這樣的話因為子程序沒有了父程序,系統就講init程序作為子程序的父程序,而init永遠不會退出,同時會在子程序退出後為其收屍,所以子程序便不會成為殭屍程序,下面將演示父程序先退出,init成為父程序

#include #include #include #include #include void main(void)

else if (0 == pid)

printf("child process exit...\n");

return; //直接正常返回,或者使用exit(1)

} else

return;

}

結果是父程序先退出,init頂替作為子程序的父程序

mcchen@mcchen-virtual-machine:/home/samba/share/mywork/test/wait$ ./wait &

[1] 13017

mcchen@mcchen-virtual-machine:/home/samba/share/mywork/test/wait$

i am parent process pid = 13017

parent process exit... //父程序先退出

i am child process pid = 13018

child process exit... //子程序後退出

[1]+ exit 23 ./wait

mcchen@mcchen-virtual-machine:/home/samba/share/mywork/test/wait$ ps

pid tty time cmd

11735 pts/4 00:00:01 bash

13018 pts/4 00:00:00 wait

13019 pts/4 00:00:00 ps

mcchen@mcchen-virtual-machine:/home/samba/share/mywork/test/wait$ cd /proc/13018

mcchen@mcchen-virtual-machine:/proc/13018$ cat status

name: wait_1

umask: 0002

state: s (sleeping)

tgid: 13018

ngid: 0

pid: 13018

ppid: 1 //init成為父程序

殭屍程序 wait waitpid

如果其所有子程序都在執行,則阻塞。如果乙個子程序已經終止,正在等待的父程序獲取到終止狀態,則取得該子程序的終止狀態立即返回。如果他沒有任何子程序,則立即出錯返回。void sig chld int signo pid 0時,只等待程序id等於pid的子程序,不管其它已經有多少子程序執行結束退出了,只...

linux 程序等待 wait waitpid

waitpid 與 wait 功能相似,都是使用者主程序等待子程序結束或中斷.可用於程序之間的同步 wait 函式原型 pid t wait int status 函式說明 wait 會臨時停止眼下程序的執行,直到有訊號來到或子程序結束.假設在呼叫wait 時子程序已經結束,則 wait 會立即返回...

Unix程序之程序概述

程序是計算機程式執行起來的動態過程。發明計算機的目的就是為了處理各式各樣的資料,人類通過程式設計工具 c c 等 編寫對處理資料的程式,完成了對現實世界中各類資料的抽象 資料型別 通過函式 類等方式把我們對資料處理的過程表達出來 程式像這樣的 c語言 程式被轉換成二進位制指令序列 像這樣 十六進製制...