进程管理之wait和waitpid(2)

遍历子进程代码:

static int do_wait_thread(struct wait_opts *wo, struct task_struct *tsk) { struct task_struct *p; list_for_each_enpty(p,&tsk->children,silbling) { int ret = wait_consider_task(wo,0,p); if(ret) return ret; } return 0; }

筛选子进程的代码:

static int eligible_pid(struct wait_opts *wo, struct task_struct *p) { return wo->wo_type == PIDTYPE_MAX || task_pid_type(p,wo->wo_type) == wo->wo_pid; }

当waitpid函数参数pid的值为-1时,wo_type的值为PIDTYPE_MAX;其他三种情况由task_pid_type函数来处理。

参数options

是一个位掩码,可以同时存在多个标志。当options的值为0时,行为和wait类似。

标志位:

WUNTRACE:关心终止子进程和因信号中断的子进程的信息(阻塞);

WCONTINUED:关系终止子进程和信号终止后由恢复执行的子进程(阻塞);

WNOHANG:指定的子进程没有发生变化,waitpid立即返回,返回值为0;出错返回时,返回值为-1,通过error=ECHILD和返回值来区分这两种情况。注意:error的值不会为EINTR,因为信号中断由WUTRACE来控制。

参数status

该参数存储的信息时按位存储的,我们没办法解析status的值,只能通过系统提供的宏去解析。这些宏安功能分可以分为两类:获取子进程状态和判断是非由相应信号产生;

进程正常退出

WIFEIXITED(status):正常退出,返回true; WEXITSTATUS(status):正常退出,获取进程退出状态;

进程收到信号退出

WIFSIGNALED(status): 被信号杀死,返回trueWTREMSIG(status):被信号杀死,返回杀死进程的pid; WCOREDUMOP(status):子进程产生core dump,返回true

进程收到信号停止

WIFSTOPPED(status):收到相关信号,暂停执行,返回true; WSTOPSIG(status):如果子进程处于停止状态,该宏返回导致子进 程停止的信号值;

进程收到信号回复执行

WIFCONTINUED(status): 递送SIGCONT信号,子进程回复执行,返回true

没有必要返回使子进程苏醒的信号的值,因为只有唯一一个SIGCONT信号才能使进程又停止状态恢复到执行状态。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13505.html