Почему после высылания сигнала SIGCONT не работает сигнал SIGSTOP?
Столкнулся с интересным поведением в своей программе: если остановить процессы с помощью сигнала SIGRTMIN+2, а потом возобновить при помощи SIGCONT, то впоследствии на очередное высылание сигнала SIGRTMIN+2 процессы уже не реагируют. Полагаю, что из-за того, что всё время продолжает действовать SIGCONT.
-- При получение сигнала SIGRTMIN+2 до всех процессов высылается сигнал SIGSTOP.
Как это исправить, чтобы можно было несколько раз останавливать и возобновлять действие программы?
Если надо, приведу весь код.
Заранее спасибо.
...
int parentPID = 0;
int child1PID = 0;
int child2PID = 0;
int child3PID = 0;
...
////////Sygnals////////
//Parent
void p_S1 (int signal){
remove("file.dat");
kill(parentPID, SIGKILL);
return;
}
void p_S2 (int signal){
kill(child1PID, SIGSTOP);
kill(child2PID, SIGSTOP);
kill(child3PID, SIGSTOP);
kill(parentPID, SIGSTOP);
return;
}
void p_S3 (int signal){
kill(parentPID, SIGCONT);
kill(child1PID, SIGCONT);
kill(child2PID, SIGCONT);
kill(child3PID, SIGCONT);
return;
}
//Children
void c_S2 (int signal){
kill(parentPID, SIGRTMIN+2);
return;
}
void c_S3 (int signal){
kill(parentPID, SIGCONT);
return;
}
int main(void)
{
printf("Proces macierzysty pracuje! \n");
parentPID = getpid();
printf ("PID procesu macierzystego: %d \n\n", parentPID);
int sig;
sigset_t mask_set, old_mask;
sigfillset(&mask_set);
sigdelset(&mask_set, SIGRTMIN+1);
sigdelset(&mask_set, SIGRTMIN+2);
sigdelset(&mask_set, SIGCONT);
sigprocmask(SIG_SETMASK, &mask_set, &old_mask);
signal(SIGRTMIN+1, p_S1);
signal(SIGRTMIN+2, p_S2);
signal(SIGCONT, p_S3);
printf("Ladujemy proces child1 ? Nacisnij jakakolwiek klawisze...");
getchar();
if(fork() == 0)
{
child1PID = getpid();
printf ("PID procesu child1: %d \n\n", child1PID);
sigset_t mask_set, old_mask;
sigfillset(&mask_set);
sigdelset(&mask_set, SIGRTMIN+1);
sigdelset(&mask_set, SIGRTMIN+2);
sigdelset(&mask_set, SIGCONT);
sigprocmask(SIG_SETMASK, &mask_set, &old_mask);
prctl(PR_SET_PDEATHSIG, SIGKILL);
signal(SIGRTMIN+1, p_S1);
signal(SIGRTMIN+2, c_S2);
signal(SIGCONT, c_S3);
...
printf("Ladujemy proces child2 ? Nacisnij jakakolwiek klawisze...");
getchar();
if(fork() == 0)
{
child2PID = getpid();
printf ("PID procesu child2: %d \n\n", child2PID);
sigset_t mask_set, old_mask;
sigfillset(&mask_set);
sigdelset(&mask_set, SIGRTMIN+1);
sigdelset(&mask_set, SIGRTMIN+2);
sigdelset(&mask_set, SIGCONT);
sigprocmask(SIG_SETMASK, &mask_set, &old_mask);
prctl(PR_SET_PDEATHSIG, SIGKILL);
signal(SIGRTMIN+1, p_S1);
signal(SIGRTMIN+2, c_S2);
signal(SIGCONT, c_S3);
...
sleep(2);
printf("Ladujemy proces child3 ? Nacisnij jakakolwiek klawisze...");
getchar();
if(fork()==0)
{
child3PID = getpid();
printf ("PID procesu child3: %d \n\n", child3PID);
sigset_t mask_set, old_mask;
sigfillset(&mask_set);
sigdelset(&mask_set, SIGRTMIN+1);
sigdelset(&mask_set, SIGRTMIN+2);
sigdelset(&mask_set, SIGCONT);
sigprocmask(SIG_SETMASK, &mask_set, &old_mask);
prctl(PR_SET_PDEATHSIG, SIGKILL);
signal(SIGRTMIN+1, p_S1);
signal(SIGRTMIN+2, c_S2);
signal(SIGCONT, c_S3);
...
char c = 'N'
while (c != 'Y')
{
printf("Konczymy dzialanie programu ? Y/N: ");
scanf("%c", c);
printf("\n");
}
kill (parentPID, SIGRTMIN+1);
}
}
}
sigwait (&mask_set, &sig);
return 0;
}