Моя цель: У меня есть простая программа на c, которая должна перезаписать обработчик SIGTSTP по умолчанию своим собственным и отправить SIGTSTP только дочернему процессу.
Моя проблема: Вызов kill в обработчике SIGTSTP останавливает родительский процесс и выходит из моей программы (а не только дочернего).Что я делаю не так?
Редактировать: Эта проблема возникает только тогда, когда я компилирую и запускаю свой код, используя следующую команду make: gcc -o program *.c -lreadline && ./program
.Кажется (процесс make
?) Завершен, потому что мой вывод содержит следующую строку после ctrl-z: gcc -o sandbox *.c -lreadline && ./sandbox
Есть ли способ, как заставить мою программу иметь желаемую функциональность, и использовать make?
Мой код:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>
#include <readline/readline.h>
int child;
void handler();
static void SIGTSTP_Handler()
{
if (child != 0) {
kill(child, SIGTSTP);
}
}
int main(void)
{
signal(SIGTSTP, SIGTSTP_Handler);
child = fork();
if (child == 0) {
setpgid(0, getpid());
printf("CHILD's PID ::: [ %d ]\n", getpid());
printf("CHILD's GROUP ::: %d\n", getpgrp());
execlp("sleep", "sleep", "30", NULL);
}
else {
setpgid(child, child);
int status;
printf("CHILD's PID (From Parent Perspective) ::: [ %d ]\n", child);
printf("PARENT's PID ::: %d\n", getpid());
printf("PARENT's GROUP ::: %d\n", getpgrp());
waitpid(child, &status, WUNTRACED | WCONTINUED);
}
while (1);
}