Приостановить разрыв оболочки - PullRequest
0 голосов
/ 02 февраля 2019

В настоящее время я пишу программу на C, которая будет (в ограниченной степени) имитировать командную строку или терминал.Пока он может запускать команды, знает, как идентифицировать внутренние команды, а также понимает, что CTRL + C останавливает запущенный процесс, не убивая оболочку, но я не могу заставить его работать - это CTRL + Z (который приостановил быпроцесс с использованием SIGTSTP, как показано ниже) (где taskPID - это текущий идентификатор процесса после разветвления).Если я вызову CTRL + C в работающем процессе, он отобразит сообщение и вернется к приглашению оболочки (которое является циклом while в основном). Если я вызову CTRL + Z, он зависнет и покажет бесконечный мигающий курсор, и япотерять контроль над Shell.Любые идеи будут оценены, так как я застрял на этом.

void
sigint_handler (int sig)
{
    printf("Process[%d] was Terminated Suddenly by User via (CTRL + C)\n",taskPID);
    kill(-taskPID, SIGINT);
}
void
sigtstp_handler (int sig)
{
  printf("Process[%d] was Suspended by User via (CTRL + Z)\n",taskPID);
  kill(-taskPID, SIGTSTP);
}

1 Ответ

0 голосов
/ 02 февраля 2019

Ctrl-Z заставляет драйвер терминала отправлять SIGSTOP в группу процессов переднего плана.Этот сигнал не может быть пойман или проигнорирован.Единственный способ предотвратить остановку вашей оболочки - это уклониться от сигнала: после разветвления (родительская) оболочка должна изменить группу процессов, оставив потомок в оригинале.

Начните с man tcsetpgrp и man setpgid.

. Как примечание стороны, printf не является безопасным сигналом.Не используйте его в обработчике сигналов.

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