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