дети не получают сигнал системного вызова - PullRequest
1 голос
/ 08 марта 2019

Отец разветвляет столько детей, сколько задано параметром из командной строки. Дети после рождения останавливаются, и отец пробуждает их, посылая сигнал.Тем не менее, в том виде, в котором я это написал, кажется, что дети никогда не получают пробуждения.Правильно ли я понимаю концепцию детских пиджей, и поэтому они никогда не получают сигнал?

. / Test 4 5 1 3 2

, как указано выше 4, 5, .... означает дочерний 4, дочерний 5, ... Я сохраняю их последовательно, поскольку они публикуются из командной строки в массиве для сохранения их индексов (для последующего использования ...) и их pids в другом массиве.Я хочу послать сигнал (хочет отец) последовательно, как указано в командной строке

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<signal.h>

void handler();

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

    pid_t proc_pid[argc-1], order[argc-1];
    int i;

    for(i=0;i<=argc-2;i++){
        order[i]=atoi(argv[i+1]);
        //printf("%d\n",order[i]);
        //printf("%d\n",i);
        if((proc_pid[i] = fork()) < 0){
            perror("fork");
        }
        else if(proc_pid[i] == 0){
           // proc_pid[i]=getpid();
            printf("%d\n",proc_pid[i]);
            pause();
            signal(SIGINT, handler);
            exit(0);
        }
        else{     
            kill(proc_pid[i], SIGINT);     
            //kill(0, SIGINT);
           // exit(0); 
        }     
    } 
    return 0;
}

void handler(){
    printf("ok\n");
}

1 Ответ

2 голосов
/ 08 марта 2019

Порядок родительского процесса и дочернего процесса неопределен.

Вы можете добавить sleep(1) в свой код, чтобы позволить отцовскому процессу запускаться после дочернего процесса, например:

...

   sleep(1);
   kill(proc_pid[i], SIGINT);     
   //kill(0, SIGINT);
   // exit(0); 

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...