к родителю, когда ребенок продолжает. Более ранние версии Linux также не имели такой поддержки.

овном процессе я слушаю SIGCHLD:

signal(SIGCHLD, &my_handler);

Затем яfork(), execv() и пусть он работает в фоновом режиме (например, / bin / cat).

Когда я пытаюсь из терминала отправить SIGSTOP дочернему процессу,my_handler() вызывается. Но когда я пытаюсь отправить SIGCONT на него, обработчик не вызывается в macOS, а выполняется в моей Ubuntu.

Мужчина:

SIGCHLD: статус ребенка изменился.

Я что-то пропустил? Это ожидаемое поведение? Я написал свое приложение на Ubuntu и ожидал, что оно будет работать и на Mac.

Я пробовал сsigaction() также, но с теми же результатами.

Вот пример кода для демонстрации:

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

void    my_handler(int signum)
{
    printf("\t SIGCHLD received\n");
    fflush(stdout);
}

void    my_kill(pid_t pid, int signum)
{
    printf("Sending %d\n", signum);
    fflush(stdout);

    kill(pid, signum);

    printf("Sent %d\n\n", signum);
    fflush(stdout);
}

int main()
{
    pid_t   pid;
    char    *cat_args[2] = {"/bin/cat", NULL};

    signal(SIGCHLD, &my_handler);
    pid = fork();

    if (pid == 0)
    {
        execv("/bin/cat", cat_args);
    }
    else
    {   
        my_kill(pid, SIGSTOP);
        my_kill(pid, SIGCONT);
        wait(NULL);
    }
    return 0;
}

С выводом на macOS:

Sending 17
         SIGCHLD received
Sent 17

Sending 19
Sent 19

Ответы на вопрос(2)

Ваш ответ на вопрос