Как убить дочерний процесс? (Язык С, UNIX)
Сейчас в университете проходим тему сигналов (предмет: Операционные системы) и как-то слабо нам всё это объясняется. Есть готовый код программы и он делает то, что нужно. Но только я не могу добиться двух вещей:
- Как вывести строку printf ("SIGXFSZ wykryte!"); ?
- он её просто игнорирует и сразу выполняет команду KILL
- Как убить дочерний процесс после выполнения программы (то есть после получения дочерним процессом сигнала SIGXFSZ или после получения главным процессом сигнала SIGUSR2) ?
proces_potomny - процесс_дочерний
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void proces_potomny(int signal){
printf("PID = %d, ", getpid());
psignal(signal, "\nOtrzymałem signal");
printf("Numer sygnału: %d. \n", signal);
if(signal == 25)
{
printf ("SIGXFSZ wykryte!");
kill(getppid(), SIGUSR2);
return;
}
return;
}
int main(void) {
sigset_t mask_set, old_mask;
sigfillset(&mask_set);
sigdelset(&mask_set, SIGUSR2);
sigprocmask(SIG_SETMASK, &mask_set, &old_mask);
if(fork() == 0)
{
sigset_t p_mask_set, p_old_mask;
sigemptyset(&p_mask_set);
sigprocmask(SIG_SETMASK, &p_mask_set, &p_old_mask);
printf(" PID: %d, PPID: %d \n", getpid(), getppid());
for(int i=1; i<=64; i++)
{
signal(i, proces_potomny);
}
}
for(;;)
pause();
return 0;
}
Ответы (1 шт):
Ну так, может, покажете как это сделать?
По исходу, что Вы представили, очень трудно понять, что же Вы хотели получить на самом деле. Например, я не понимаю, почему Вы готовите аж два sigset_t но не используете ни того ни другого в sigaction(). У Вас вообще нет вызова sigaction(). Кто же тогда ловит сигналы?
Азы:
Любой процесс, который собирается ловить сигналы, должен:
Содержать функцию-обработчик сигналов с сигнатурой
void (*sa_sigaction)(int, siginfo_t *, void *);
Подготовить маску sigset_t sa_mask; указывающую, какие именно сигналы он собрался ловить.
Выполнить системный вызов sigaction() для того, что бы процесс начал "слушать" данный сигнал.
Вы говорите о двух процессах - родительском и дочернем. Для создания дочернего вы используете fork(). Это, безусловно, правильно. Вот только используете Вы его не правильно. По классике это должно выглядеть как-то так:
pid = fork(); // Создаём КОПИЮ родительского процесса
if (pid < 0) {
printf("Ошибка!\n");
exit(-1);
}
else if(pid == 0) {
printf("Мы в дочернем процессе\n");
// Делаем что-то в двоичном процессе
exit(0); // И завершаем его
} else {
printf("Родитель создал дочерний процесс %d\n", pid);
// Ожидаем завершения дочернего процесса
waitpid(pid, &wstatus, 1);
printf("Дочерний процесс %d завершился\n", pid);
}
Если же вы желаете, что бы родель и порождённый обменивались сигналами, то в обоих ветках оператора if() надо подготовить свои маски сигналов и задать свой обработчик этих сигналов с помощью sigaction().
Это в двух словах...
man 2 sigaction
man 2 waitpid