SIGSTOP на C: недопустимый аргумент - PullRequest
0 голосов
/ 14 июля 2020

У меня есть этот код. Проблема в том, что SIGSTOP выдает мне ошибку «Invalid Argument». Мне нужно дождаться SIGCONT от parent, прежде чем Child1 и Child2 смогут продолжить, но я не могу этого сделать. Как решить?

Спасибо!

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>
#include <errno.h>

int main(int argc, char** argv) {

int pid1=0;
int pid2=0;

if((pid1=fork())==0) { //Child1

    if(signal(SIGSTOP, SIG_DFL)==SIG_ERR) perror("P1: Error SIGSTOP: ");
    if(signal(SIGCONT, SIG_DFL)==SIG_ERR) perror("P1: Error SIGCONT: ");
    pause();

    printf("P1: I can continue.\n");

} else if((pid2=fork())==0) { //Child2

    if(signal(SIGSTOP, SIG_DFL)==SIG_ERR) perror("P2: Error SIGSTOP: ");
    if(signal(SIGCONT, SIG_DFL)==SIG_ERR) perror("P2: Error SIGCONT: ");
    pause();

    printf("P2: I can continue.\n");

} else { //Parent

    printf("G: PID: %d\n", getpid());

    kill(pid1, SIGSTOP);
    kill(pid2, SIGSTOP); 

    //Some work
    
    kill(pid1, SIGCONT);
    kill(pid2, SIGCONT);

    wait(0); wait(0);

    exit(0);

}

}

1 Ответ

3 голосов
/ 14 июля 2020

Сигнал SIGSTOP (то же самое для SIGKILL) не может быть пойман или его расположение изменилось - что вы пытаетесь сделать.

Вам просто нужно избавиться от signal(SIGSTOP, SIG_DFL) звонки.

From signal (7) :

Сигналы SIGKILL и SIGSTOP не могут быть пойманы, заблокированы или проигнорированы.

...