码迷,mamicode.com
首页 > 系统相关 > 详细

一、进程与信号之进程相关系统调用

时间:2016-09-01 01:56:07      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

进程调用函数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: 2833
normal exit: 3
---------------------------
pid: 2835,ppid: 2833
abnormal term: 8
---------------------------
pid: 2837,ppid: 2833
abnormal term: 9
---------------------------
pid: 2841,ppid: 2833
abnormal term: 9
---------------------------

 

一、进程与信号之进程相关系统调用

标签:

原文地址:http://www.cnblogs.com/peixiguang/p/5828065.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!