【问题标题】:children do not get the system call signal孩子没有得到系统调用信号
【发布时间】:2019-07-30 07:03:54
【问题描述】:

父亲根据命令行给出的参数分叉多少孩子。出生后的孩子暂停,父亲通过发送信号唤醒他们。然而,以我写它的方式,孩子们似乎从来没有得到清醒的信号。我是否对儿童 pid 的概念有误解,这就是他们永远不会收到信号的原因?

./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");
}

【问题讨论】:

  • 在使用 argcargv 之前,请始终确保它们有效。例如,如果用户不提供任何参数,你的数组会发生什么? 总是进行验证(尤其是用户输入)和错误检查。顺便说一句,按照您编写代码的方式,实际上实际上不需要数组。
  • 至于你的问题,想想你在子进程中做了什么。想想pause 函数的作用,以及你做事的顺序。请记住,您无法控制首先运行哪个进程,也许父进程会在子进程运行之前发送SIGINT
  • 管道是控制哪个进程首先运行的唯一方法吗?

标签: c operating-system signals system-calls


【解决方案1】:

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

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

...

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

...

【讨论】:

  • 我还想问一下,为什么即使经过正确的更改,孩子们也没有进入信号处理函数
  • @maritsamp 在pause 之前添加signal 调用,以便安装信号处理程序
  • 感谢大家的帮助。我确实修复了你提到的所有事情。我发现信号有点混乱,所以我有最后一个问题。当我在父亲代码中发送 kill(....) 时,我会“激活”每个进程一次。如果我想多次激活每个进程,例如 2,我是否在循环中包含 kill 语句?我确实尝试过类似的方法: for(j=0;j
  • @maritsamp 是的。
猜你喜欢
  • 2022-01-22
  • 2014-09-10
  • 2022-11-07
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2011-10-08
  • 2017-07-31
相关资源
最近更新 更多