SIGCONT на поведение MACOS X - PullRequest
       64

SIGCONT на поведение MACOS X

0 голосов
/ 04 декабря 2018

Когда я вызываю waitpid () с настройками WUNTRACED | WCONTINUED, чтобы узнать, когда дочерний процесс получает SIGSTOP и SIGCONT.SIGSTOP не является проблемой, но я не могу перехватить сигнал sigcont с помощью функции WIFCONTINUED (stat), но программа продолжается, когда я посылаю сигнал с терминала.Прилагаемый код иллюстрирует проблему: дочерние SIGCONT продолжают дочерний процесс, но waitpid () остается заблокированным, а родительский SIGCONT просто не замечается.

Однако код полностью функционален в Sparc Solaris 2

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>

main() {
    pid_t pid;

    if ( (pid = fork()) == -1 )
        printf("could not fork");
    else if ( pid == 0 ) { /* child */
        sleep(1); /* wait for the parent to prepair */
        kill(getpid(),SIGSTOP); /* send SIGSTOP to myself */
        while(1); /* loop */
    }
    else { /* parent */
        int stat;
        waitpid(pid,&stat,WUNTRACED|WCONTINUED);
        while ( WIFSTOPPED(stat) || WIFCONTINUED(stat) ) {
            if ( WIFSTOPPED(stat) ) {
                printf("child was stopped\n");
                /* if the next line is uncommented, SIGCONT is caught property */
                /* kill(pid,SIGCONT); */
            }
            if ( WIFCONTINUED(stat) ) {
                /* this part is never reached */
                printf("child was continued\n");
                kill(pid,SIGTERM); /* terminate child */
            }
            waitpid(pid,&stat,WUNTRACED|WCONTINUED);
        }
    }
}
...