如何避免使用用户定义的信号终止进程

时间:2019-04-27 22:44:40

标签: c fork

我试图从终端向子进程发送信号,但是每次我向SIGUSR1或SIGUSR2发送信号时,它都会杀死进程。例如,当我键入“ r1”时,它应该为第一艘潜艇加油,但为所有潜艇加油,并杀死所有进程。 输出显示“程序被信号SIGUSR2(用户定义的信号2)终止”。

我已经尝试过在信号之间睡觉。

这是我认为问题所在的两个功能。

void doChild(int SubNum, int Terminal)
{
  Sub = SubNum;
  char string[15];
  sprintf(string, "/dev/pts/%d", Terminal);
  fpt = fopen(string,"w");
  ChildPID[SubNum-1] = getpid();
  srand(time(0)*SubNum);
  Fuel = rand() % 4001 + 1000;
  Missiles = rand() % 5 + 6;
  signal(SIGALRM, AlarmHandler);
  alarm(3);
  signal(SIGUSR1, LaunchMissile);
  signal(SIGUSR2, Refuel);
  while(1);
}

void Input(void)
{
  char inchars[5];


  while (Processes > 0)
  {
    scanf("%s", inchars);
    fflush(stdin);
    numProcess = atoi(&inchars[1]);

    if (strlen(inchars) == 1)
    {
      if (inchars[0] == 'q')
      {
        kill(ChildPID[0], SIGKILL);
        kill(ChildPID[1], SIGKILL);
        kill(ChildPID[2], SIGKILL);
        Processes = 0;
      }
    }

    if (strlen(inchars) == 2)
    {
      if (inchars[0] == 'l')
      {
        kill(ChildPID[numProcess], SIGUSR1);
        break;
      }
      else if (inchars[0] == 'r')
      {
        kill(ChildPID[numProcess], SIGUSR2);
        break;
      }
      else if (inchars[0] == 's')
      {
  //      kill(ChildPID[numProcess], SIGKILL);
        fprintf(fpt, "Sub %d Process Killed", Sub);
        Processes--;
      }
      else printf("Invalid Submarine Number\n");
    }

    if (strlen(inchars) > 2)
    {
      kill(ChildPID[0], SIGKILL);
      kill(ChildPID[1], SIGKILL);
      kill(ChildPID[2], SIGKILL);
      Processes = 0;
      printf("Invalid Input. Processes Killed\n");
    }
  }
}

0 个答案:

没有答案