waitpid_waitpid -表頭文件
#include<sys/types.h>
#include<sys/wait.h>
定義函數(shù) pid_t waitpid(pid_t pid,int * status,int options);
waitpid_waitpid -函數(shù)說(shuō)明
waitpid()會(huì)暫時(shí)停止目前進(jìn)程的執(zhí)行,直到有信號(hào)來(lái)到或子進(jìn)程
結(jié)束。如果在調(diào)用 waitpid()時(shí)子進(jìn)程已經(jīng)結(jié)束,則 waitpid()會(huì)立即
返回子進(jìn)程結(jié)束狀態(tài)值。 子進(jìn)程的結(jié)束狀態(tài)值會(huì)由參數(shù) status 返回,
而子進(jìn)程的進(jìn)程識(shí)別碼也會(huì)一起返回。如果不在意結(jié)束狀態(tài)值,則
參數(shù) status 可以設(shè)成 NULL。參數(shù) pid 為欲等待的子進(jìn)程識(shí)別碼,
其他數(shù)值意義如下:
pid<-1 等待進(jìn)程組識(shí)別碼為 pid絕對(duì)值的任何子進(jìn)程。
pid=-1 等待任何子進(jìn)程,相當(dāng)于 wait()。
pid=0 等待進(jìn)程組識(shí)別碼與目前進(jìn)程相同的任何子進(jìn)程。
pid>0 等待任何子進(jìn)程識(shí)別碼為 pid 的子進(jìn)程。
參數(shù)options提供了一些額外的選項(xiàng)來(lái)控制waitpid,參數(shù) option 可以為 0 或可以用"|"運(yùn)算符把它們連接起來(lái)使用,比如:
ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);
如果我們不想使用它們,也可以把options設(shè)為0,如:
ret=waitpid(-1,NULL,0);
WNOHANG 若pid指定的子進(jìn)程沒(méi)有結(jié)束,則waitpid()函數(shù)返回0,不予以等待。若結(jié)束,則返回該子進(jìn)程的ID。
WUNTRACED 若子進(jìn)程進(jìn)入暫停狀態(tài),則馬上返回,但子進(jìn)程的結(jié)束狀態(tài)不予以理會(huì)。WIFSTOPPED(status)宏確定返回值是否對(duì)應(yīng)與一個(gè)暫停子進(jìn)程。
子進(jìn)程的結(jié)束狀態(tài)返回后存于 status,底下有幾個(gè)宏可判別結(jié)束情況:
WIFEXITED(status)如果若為正常結(jié)束子進(jìn)程返回的狀態(tài),則為真;對(duì)于這種情況可執(zhí)行WEXITSTATUS(status),取子進(jìn)程傳給exit或_eixt的低8位。
WEXITSTATUS(status)取得子進(jìn)程 exit()返回的結(jié)束代碼,一般會(huì)先用 WIFEXITED 來(lái)判斷是否正常結(jié)束才能使用此宏。
WIFSIGNALED(status)若為異常結(jié)束子進(jìn)程返回的狀態(tài),則為真;對(duì)于這種情況可執(zhí)行WTERMSIG(status),取使子進(jìn)程結(jié)束的信號(hào)編號(hào)。
WTERMSIG(status) 取得子進(jìn)程因信號(hào)而中止的信號(hào)代碼,一般會(huì)先用 WIFSIGNALED 來(lái)判斷后才使用此宏。
WIFSTOPPED(status) 若為當(dāng)前暫停子進(jìn)程返回的狀態(tài),則為真;對(duì)于這種情況可執(zhí)行WSTOPSIG(status),取使子進(jìn)程暫停的信號(hào)編號(hào)。
WSTOPSIG(status) 取得引發(fā)子進(jìn)程暫停的信號(hào)代碼,一般會(huì)先用 WIFSTOPPED 來(lái)判斷后才使用此宏。
如果執(zhí)行成功則返回子進(jìn)程識(shí)別碼(PID) ,如果有錯(cuò)誤發(fā)生則返回
返回值-1。失敗原因存于 errno 中。
waitpid_waitpid -示例代碼
/******
* waitpid.c - Simple wait usage
*********/
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
pid_t childpid;
int status;
childpid = fork();
if ( childpid < 0 )
{
perror( "fork()" );
exit(EXIT_FAILURE);
}
else if ( childpid == 0 )
{
puts( "In child process" );
sleep( 3 );//讓子進(jìn)程睡眠3秒,看看父進(jìn)程的行為
printf("tchild pid = %dn",getpid());
printf("tchildPPID= %dn",getppid());
exit(EXIT_SUCCESS);
}
else
{
waitpid( childpid, &status, 0 );
puts( "in parent" );
printf( "tparent pid = %dn", getpid() );
printf( "tparent ppid = %dn", getppid() );
printf( "tchild process exited with status %d n", status );
}
exit(EXIT_SUCCESS);
}
[root@localhost src]# gcc waitpid.c
[root@localhost src]# ./a.out
In child process
child pid = 4469
child ppid = 4468
in parent
parent pid = 4468
parent ppid = 4379
child process exited with status 0
[root@localhost src]#
如果將上面“waitpid( childpid, &status, 0 );”行注釋掉,程序執(zhí)行效果如下:
[root@localhost src]# ./a.out
In child process
in parent
parent pid = 4481
parent ppid = 4379
child process exited with status 1331234400
[root@localhost src]# child pid = 4482
child ppid = 1
子進(jìn)程還沒(méi)有退出,父進(jìn)程已經(jīng)退出了。

愛(ài)華網(wǎng)本文地址 » http://www.klfzs.com/a/8103360103/70985.html
愛(ài)華網(wǎng)



