Как уберечься от процессов убийства с помощью пользовательских сигналов - PullRequest
1 голос
/ 28 апреля 2019

Я пытаюсь отправить сигнал дочерним процессам с терминала, но каждый раз, когда я посылаю сигнал на 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");
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...