我是靠谱客的博主 健壮小兔子,最近开发中收集的这篇文章主要介绍waitpid等待子进程收到STOP CONTINU信号,并且从terminal status看是什么信号引起的,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. waitpid一般等待子进程的退出,但是也可以用来等待子进程收到的STOP/CONTINU信号

2. 子进程因为什么推出,可以从第二个参数terminal status中查看

 

其中函数pr_exit是用来判断子进程退出原因的。

先是子进程给自己发送了SIGTSTP,这样子进程就停止了。

当父进程收到子进程STP后,发送了SIGCONT信号,让子进程继续执行。

要接收这两个时间,waitpid需要使用WUNTRACED,WCONTINUED这两个option。

 

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/wait.h>

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
 
void pr_exit(int status)
{
    if (WIFEXITED(status))
        printf("normal termination, exit status = %d/n",
                WEXITSTATUS(status));
    else if (WIFSIGNALED(status))
        printf("abnormal termination, signal number = %d%s/n",
                WTERMSIG(status),
#ifdef  WCOREDUMP
                WCOREDUMP(status) ? " (core file generated)" : "");
#else
                "");
#endif
    else if (WIFSTOPPED(status))
        printf("child stopped, signal number = %d/n",
                WSTOPSIG(status));
    else if (WIFCONTINUED(status))
        printf("child continuing.../n");
}

static void sig_hup(int signo)
{
    printf("SIGHUP received, pid = %d/n", getpid());
}

static void sig_tstp(int signo)
{
    printf("SIGTSTP received, pid = %d/n", getpid());
}

static void pr_ids(char *name)
{
    printf("%s: pid = %d, ppid = %d, pgrp = %d, tpgrp = %d/n",
            name , getpid(), getppid(), getpgrp(), tcgetpgrp(STDIN_FILENO));
    fflush(stdout);
}

int main(void)
{
    char   c;
    pid_t  pid;
    int    status;

    pr_ids("parent");
    if ((pid = fork()) < 0)
    {
        perror("fork error");
        return 0;
    }
    else if (pid > 0)
    {
//        sleep(10);
        printf("child process starts %d/n", pid);
        waitpid(pid, &status, WUNTRACED |WCONTINUED);
        pr_exit(status);
        kill(pid, SIGCONT);
        waitpid(pid, &status, WUNTRACED|WCONTINUED );
        pr_exit(status);
        exit(0);
    }
    else
    {
        sleep(5);
        pr_ids("child 1");
//        signal(SIGHUP, sig_hup);
//        signal(SIGTSTP, sig_tstp);
        kill(getpid(), SIGTSTP);
        pr_ids("child 2");
        sleep(10);
        if (read(STDIN_FILENO, &c, 1) != 1)
            printf("read error from controlling TTY, errno = %d/n", errno);
        printf("input: %c/n",c);
        exit(0);
    }

    return 0;
}

最后

以上就是健壮小兔子为你收集整理的waitpid等待子进程收到STOP CONTINU信号,并且从terminal status看是什么信号引起的的全部内容,希望文章能够帮你解决waitpid等待子进程收到STOP CONTINU信号,并且从terminal status看是什么信号引起的所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部