Мой источник выглядит так:
keep_going = 1;
struct sigaction action;
memset(&action, '\0', sizeof(action));
action.sa_sigaction = &signal_handler;
if (sigaction(SIGUSR1, &action, NULL) < 0) {
perror ("sigaction\n");
return 1;
}
pid_t cpid = fork();
if(cpid == 0)
{
// child process
child_process(&p_config_0);
}
else if (cpid < 0)
{
perror("fork not successful\n");
}
else
{
// parent process
pthread_t mgmt_tid;
int rc_1 = pthread_create(&mgmt_tid, NULL, mgmtSrvcThread, (void *) &p_config_0);
if(rc_1)
{
printf("error: pthread_create() is %d\n", rc_1);
exit(1);
}
parent_process(&p_config_0);
}
void signal_handler(int sig, siginfo_t *siginfo, void *context)
{
printf("signal received: %d\n", sig);
printf("waiting until configuration is done\n");
keep_going = 0;
sleep(5);
printf("done\n");
keep_going = 1;
}
Переменная keep_going
известна обоим процессам, дочернему и родительскому.
Родитель запускает другой поток, прежде чем начать нормальную работу. Этот поток прослушивает управляющую информацию и устанавливает keep_going
в значение false, чтобы остановить как рабочие процессы, так и родительский и дочерний процессы. Это работает, но кажется, что это неправильно, и на самом деле я не совсем уверен, что происходит ...
Поскольку я устанавливаю обработчик сигналов перед разветвлением, я думаю, что после разветвления их будет два: один для родителя и один для ребенка, верно? Обработчик сигнала устанавливает переменную, которая управляет циклом while(keep_going)
в обоих процессах.
Теперь мой вопрос, я хочу, чтобы поток, выполняющий метод mgmtSrvcThread
, остановил оба процесса, когда он вызывает raise(SIGUSR1)
. И оба процесса должны продолжать выполнять свою работу, когда настройка выполняется внутри потока. Возможно, будет отправлен второй сигнал или настроен тайм-аут. Каков наилучший способ управления двумя процессами из одного потока.
Я был бы рад получить любую помощь.
Заранее спасибо.
nyyrikki