首页 > 代码库 > 一、进程与信号之进程相关系统调用
一、进程与信号之进程相关系统调用
进程调用函数wait(),waitpid()
#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *status) //等待所有子进程,返回任一终止子进程的状态,阻塞方式pid_t waitpid(pid_t pid,int *status,int options)//指定子进程pid等待终止返回,option设置是否阻塞
status参数
为空时,代表任意状态结束的子进程,若不为空,则代表指定状态结束的子进程
检查wait和waitpid函数返回终止状态的宏
WIFEXITED/WEXITSTATUS(status)
若为正常终止子进程返回的状态,则为真
WIFSIGNALED/WSTOPSIG(status)
若为异常终止子进程返回的状态,则为真(接不到一个不能捕捉的信号)
option参数
WNOHANG
若由pid指定的子进程没有退出则立即返回,则waitpid不阻塞,此时返回值为0
WUNTRACED
若某实现支持作业控制,则由pid指定的任一子进程已暂停,且其状态自暂停依赖还未报告过,则返回其状态
进程函数wait范列
#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <sys/wait.h>void out_status(int status){ //通过宏来分析子进程是哪种退出方式 if(WIFEXITED(status)) { printf("normal exit: %d\n",WEXITSTATUS(status)); } else if(WIFSIGNALED(status)) { printf("abnormal term: %d\n",WTERMSIG(status)); } else if(WIFSTOPPED(status)) { printf("stopped sig: %d\n",WSTOPSIG(status)); } else { printf("unknow sig\n"); }}int main(void){ int status; pid_t pid; if((pid=fork())<0) { printf("fork error"); exit(1); } else if(pid == 0) { //结束子进程 printf("pid: %d,ppid: %d\n",getpid(),getppid()); exit(3); } //设置父进程的wait的阻塞,等待回收子进程 wait(&status); out_status(status); printf("---------------------------\n"); if((pid=fork())<0) { printf("fork error"); exit(1); } else if(pid == 0) { //结束子进程 printf("pid: %d,ppid: %d\n",getpid(),getppid()); int i=3,j=0; int k=i/j; printf("k: %d\n",k); } //设置父进程的wait的阻塞,等待回收子进程 wait(&status); out_status(status); printf("---------------------------\n"); if((pid=fork())<0) { printf("fork error"); exit(1); } else if(pid == 0) { //结束子进程 printf("pid: %d,ppid: %d\n",getpid(),getppid()); pause();//进程暂停,通过信号结束进程 } //设置父进程的wait的阻塞,等待回收子进程 wait(&status); out_status(status); printf("---------------------------\n"); if((pid=fork())<0) { printf("fork error"); exit(1); } else if(pid == 0) { //结束子进程 printf("pid: %d,ppid: %d\n",getpid(),getppid()); //pause(),通过死循环阻塞 int i=0; while(++i) { sleep(1); } } //设置父进程的wait的阻塞,等待回收子进程 wait(&status); out_status(status); printf("---------------------------\n");}
编译执行,并在另一个终端kill子进程,打印出子进程结束方式
pid: 2834,ppid: 2833normal exit: 3---------------------------pid: 2835,ppid: 2833abnormal term: 8---------------------------pid: 2837,ppid: 2833abnormal term: 9---------------------------pid: 2841,ppid: 2833abnormal term: 9---------------------------
一、进程与信号之进程相关系统调用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。