Почему после высылания сигнала 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;
}


Ответы (0 шт):