您的当前位置:首页Linux系统编程,wait和waitpid

Linux系统编程,wait和waitpid

2020-04-15 来源:乌哈旅游
头pid_t pid_t

文件:wait(int

#include

*status);

waitpid(pid_t pid, int *status, int options);

这两个函数都是用于去侦察子进程的,就像是两个侦察兵,看看子进程

如果子进程的状态变化了,这些调用函数马上就会返回,如果没有变化直参

status- pid option

回是是

的子一

父到

子进进

程程

就的数是

子进些

进程参程

的的数状

会状

态被变

阻化

塞 ; : 态 pid 宏

WNOHANG-没有孩子时,函数立即返回 WUNTRACED-如果一个孩子被停止了,函数则返回 WCONTINUED-如果一个被停止的孩子被信号SIGCONT激活

返回的

status

需要一些宏来进行解析:

WIFEXITED(status):如果孩子正常终止则值为真 WEXITSTATUS(status):返回孩子的状态,由status的低8位组成,只有在WIFEXITED(status)为真时(也就是孩子正常死亡时)才能调用

WIFSIGNALED(status):如果孩子是被信号谋杀的则为真 WTERMSIG(status):返回谋杀孩子的信号数杀手,只有确定信号是

WIFSTOPPED(status):如果孩子是被信号停止的则为真 WSTOPSIG(status):返回能停止孩子的信号数 WIFCONTINUED(status):如果孩子是被信号SIGCONT重新激活的 ex: 运

jack@jack-K45VD:~/桌面/Mine_Linux_Program$ ./a.out & [3]

4944

jack@jack-K45VD:~/桌面/Mine_Linux_Program$ Child PID is 4945 kill stopped

by

-STOP

signal

4945 19

jack@jack-K45VD:~/桌面/Mine_Linux_Program$ kill -CONT 4945 continued

jack@jack-K45VD:~/桌面/Mine_Linux_Program$ kill -TERM 4945 killed

jack@jack-K45VD:~/[3]+

by

桌成桌

面面

signal

15

/Mine_Linux_Program$

./a.out

jack@jack-K45VD:~//Mine_Linux_Program$

#include #include #include #include int main(int {

if (cpid == 0) { /* Code executed by child */

printf(\"Child

if

PID

is (argc

%ld\\n\

(long) ==

getpid());

1)

if

cpid

(cpid

= ==

-1)

fork();

{

pid_t

int

cpid,

w; status;

argc,

char

*argv[])

perror(\"fork\");

exit(EXIT_FAILURE);

}

pause(); /* WaitEXIT_FAILURE for signals */

} else { /* Code executed by parent */

do

{

_exit(atoi(argv[1]));

w = waitpid(cpid, &status, WUNTRACED | WCONTINUED);

if

(WIFEXITED(status))

{//

if

(w

==

-1)

{

perror(\"waitpid\"); exit(EXIT_FAILURE);

} 止

printf(\"exited, status=%d\\n\WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) {//被信号终止 printf(\"killed by signal %d\\n\WTERMSIG(status)); } else if (WIFSTOPPED(status)) {//被信号停止 printf(\"stopped by signal %d\\n\WSTOPSIG(status)); } else if (WIFCONTINUED(status)) {//被信号激活

printf(\"continued\\n\");

}

} while (!WIFEXITED(status) && !WIFSIGNALED(status));

exit(EXIT_SUCCESS);

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容