Вы хотите перехватить сигнал SIGCHLD и затем вызвать функцию. Вы хотите использовать signal()
для этого (man signal
). В приведенном ниже примере child_died()
вызывается после перехвата сигнала SIGCHLD (дочерний процесс на этом этапе не работает). Если есть информация, которую вам нужно передать от дочернего элемента к родительскому элементу, который необходим child_died()
для условного выражения, вам необходимо использовать канал (man pipe
). Вот пример сигнала и трубы:
#include <signal.h>
#include <strings.h>
#include <stdio.h>
#define MAX_SIZE 256
void child_died(int);
int fd[2];
int main()
{
int pid;
extern int fd[];
char *str;
pipe(fd);
signal(SIGCHLD, child_died);
if ((pid = fork()) < 0) {
// error
printf("Error\n");
} else if (pid == 0) {
// child
printf("In child process\n");
close(fd[0]);
str = strdup("Message from child process.\n");
write(fd[1], str, strlen(str) + 1);
} else {
// parent
wait();
printf("Now in parent\n");
}
return 0;
}
void child_died(int s)
{
char *str;
close(fd[1]);
read(fd[0], str, MAX_SIZE);
printf("%s", str);
}
Сохранено как sigchld.c и скомпилировано с: gcc -Wall sigchld.c -o sigchld
Если вы хотите передать int (например, дочерний pid) или какой-либо другой тип данных из дочернего процесса в родительский процесс, вам нужно будет либо преобразовать его в строку и обратно, либо найти другой способ сделать это. это.
Если вы хотите игнорировать SIGCHLD, то в моем примере вы поместите эту логику в child_died()
. Просто используйте простой if
. Я не знаю, как вы решаете, когда игнорировать сигнал, а когда печатать то, что вы хотите, поэтому я включил материал канала в мой код выше. Я подумал, что вы будете использовать некоторую информацию из дочернего процесса, и, поскольку child_died()
вызывается для родительского процесса, вам потребуется способ передачи данных из дочернего процесса в родительский процесс.
Надеюсь, это поможет. Могут быть лучшие или более простые способы достижения этого, о которых я не знаю. Если есть, пожалуйста, прокомментируйте.