孩子没有得到系统呼叫信号

时间:2019-03-08 09:13:36

标签: c operating-system signals system-calls

父亲分叉了与命令行中给定的参数一样多的孩子,分娩后的孩子被暂停,父亲通过发送信号唤醒他们。但是,按照我写这本书的方式,孩子们似乎从来没有得到唤醒的信号。我会误以为儿童pid的概念,这就是为什么他们从不收到信号吗?

  

./ test 4 5 1 3 2

如上面4、5,...所述。代表孩子4,孩子5 ... 当它们从命令行发布到数组中时,我将它们连续保存,以将它们的索引(供以后使用...)和它们的pid保存在另一个数组中。我想按命令行中的顺序连续发送(父亲想要的)信号

#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 个答案:

答案 0 :(得分:2)

父进程和子进程的顺序不确定。

您可以在代码中添加sleep(1),以使父进程在子进程之后运行,如下所示:

...

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

...