wait() 和 waitpid()

wait() 和waipid()

子进程比父进程先结束执行,则子进程将成为僵死进程
父进程比子进程先结束,则子进程将成为孤儿进程,他将有init (pid =1)收养;

主动调用wait() 和 waitpid() 的进程A可能发生什么?
    如果他的子进程还在运行,则A进程阻塞
    如果他的子进程已经停止,则正在等待的进程A会立即返回,
    如果进程A没有子进程,在返回出错;

#include<sys/wait.h>
wait(int *status)
waitpid(pid_t pid,int *status,int options)
    返回值:成功,返回进程ID,出错 返回0
    
pid == -1 等待任意一子进程 == wait()
pid > 0   等待进程ID == pid 的进程
pid == 0  等待组ID == 调用进程组ID 的任意 一子进程
pid < 0   等待组ID 等于pid 绝对值的任意一子进程


waitpid 提供的功能比wait 多的3 个功能
    可以等待制定进程
    提供了不阻塞版本wait

    支持作业控制

有多少个子进程就应该有几个wait 或waitpid()


#include<sys/wait.h>
void exitAnalyse(int status)
{
    if(WIFEXITED(status))
    {
        cout<<"normal::"<<WEXITSTATUS(status)<<endl;
    }
    if(WIFSIGNALED(status))
    {
        cout<<"abnormal::"<<WTERMSIG(status)<<"; "<<WCOREDUMP(status)<<endl;
    }
    if(WIFSTOPPED(status))
    {
        cout<<"Stop::"<<WSTOPSIG(status)<<endl;
    }
}
void waitTest()
{
    int status =0;
    pid_t pid = fork();
    if(pid ==0)
    {
        cout<<"child___1..pid = "<<getpid()<<endl;
       // sleep(1);
        exit(1);
    }
    else
    {
         cout<<"parent___1"<<endl;
    }
    pid = fork();
    if(pid ==0)
    {
        cout<<"child___2..pid = "<<getpid()<<endl;
        sleep(5);
       return;
    }
    else
    {
         cout<<"parent___2"<<endl;
    }
    /*
    int x;
    x = wait(&status);
    cout<<"parent end  :  "<<x<<endl;
    exitAnalyse(x);
    x = wait(&status);
    cout<<"parent end  :  "<<x<<endl;
    exitAnalyse(x);
    */
    cout<<waitpid(pid,NULL,WNOHANG)<<endl;
    sleep(22);
}
int main()
{
    cout<<"=====waitTest======"<<endl;
    waitTest();
    return 1;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Car12

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值