к родителю, когда ребенок продолжает. Более ранние версии 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