Обработчик SIGTSTP завершает как родительский, так и дочерний процесс - PullRequest
0 голосов
/ 18 сентября 2018

Моя цель: У меня есть простая программа на 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);
}

1 Ответ

0 голосов
/ 19 сентября 2018

Проблема была вызвана тем, что команда make, с которой я запустил программу, была прервана на ctrl-z.Чтобы устранить проблему, вы можете:

СТАРОЙ. Команда создания проблемы:

gcc -o program *.c && ./program

Потенциальные решения:

(1) Удалите строку && ./program из команды make

(2) Скомпилируйте и запустите вашу программу без использования make

Я не уверен, есть лив любом случае, по-прежнему использовать, запустите программу, используя make, если вы хотите, чтобы ваша основная программа работала в случае сигнала SIGTSTP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...