linux进程系列(9)wait函数 代码示例

来源:互联网 发布:dede分类目录源码 编辑:程序博客网 时间:2024/06/05 19:08

一个父进程创建了三个子进程,三个子进程分别以不同的状态停止运行,通过宏获取当前子进程的结束状态。

main.cpp

#include <unistd.h>#include <string.h>#include <stdlib.h>#include <sys/wait.h>#include <sys/types.h>#include <stdio.h>void out_status(int status){if(WIFEXITED(status)){printf("normal exti: %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("unkown sig\n");}}int main(void){int status;pid_t pid;if((pid = fork()) < 0){perror("forlk 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){perror("fork error");exit(1);}else if(pid == 0){printf("pid: %d, ppid: %d\n", getpid(), getppid());int i = 3;int j = 0;int k = i / j; //除零操作printf("k: %d\n", k);}wait(&status);out_status(status);printf("-----------------------------------\n");if((pid = fork()) < 0){perror("fork error");exit(1);}else if(pid == 0){printf("pid: %d, ppid: %d\n", getpid(), getppid());pause();//暂停}        do        {            //如果返回的是0,说明子进程没有结束,如果子进程结束返回的是子进程pid            pid = waitpid(pid, &status, WNOHAND | WUNTRACED);//非阻塞方式            if(pid == 0)//子进程没有结束            {                sleep(1);//父进程睡眠            }        }while(pid == 0);        out_status(status);printf("-----------------------------------\n");return 0;}

执行程序,并对第三个子进程发生终止信号:

若对第三个进程发送暂停信号,然后再发送终止信号,如果在这种情况下使用的是wait函数,则第三个进程不会被终止,因此在上面的代码中我们使用了waitpid函数。


阅读全文
0 0
原创粉丝点击