Создание моей собственной оболочки.Обработка Ctrl-Z и затем отправка SIGCONT закрывает процесс, а не продолжает его - PullRequest
0 голосов
/ 06 декабря 2018

Я создаю свою собственную оболочку на языке Си.До сих пор я реализовал много функций, но у меня возникли проблемы с обработкой CTRL-Z (SIGTSTP).Позвольте мне указать проблему для успешных попыток:

  • Когда я выполняю программу в своей оболочке (например, gedit), а затем нажимаю Ctrl-Z, она выполняет kill (p_id, SIGTSTP) и останавливаетсяэтот процесс.Оболочка также добавляет идентификатор процесса в массив background_processes, чтобы мы могли достичь его в дальнейшем.Затем, если я введу «fg» в своей оболочке, он выведет процесс на передний план и выполнит kill (p_id, SIGCONT), чтобы мы могли продолжать использовать программу.Также оболочка ожидает завершения процесса, выполняя функцию waitpid.Мы закрываем программу, нажав кнопку X или нажав Ctrl-C.Точно то же самое в оболочке Linux.SUCCESFULL !!!

  • Если я выполняю программу в своей оболочке (например, gedit) в фоновом режиме, указав & (амперсанд), он автоматически запускает этот процесс в фоновом режиме, не ожидая его.Но он добавляет идентификатор процесса в массив background_processes, чтобы мы могли достичь его в дальнейшем.Затем, когда я набираю «fg» в своей оболочке, это выводит процесс на первый план.Фактически он ожидает завершения процесса, выполняя функцию waitpid.Также не имеет значения, если в фоновом режиме будет более одного процесса, они будут выводиться на первый план один за другим.Мы закрываем программы, нажимая кнопку X или нажимая Ctrl-C.Точно то же самое в оболочке Linux.SUCCESFULL !!!

  • Позволяет выполнить процесс на переднем плане, а затем отправить его в фоновый режим с помощью Ctrl-Z и выполнить процесс в фоновом режиме.У нас есть 2 процесса в фоновом режиме.Если я наберу "fg", это выведет первый фоновый процесс на передний план и ждет его.Если я нажимаю кнопку X (кнопка закрытия), которая закрывает программу, оболочка выводит второй процесс на передний план и ждет его.Идем очень хорошо, вот что мы хотим.Таким образом, этот сценарий также работал очень хорошо.

  • Сценарий проблемы такой же, как и предыдущий сценарий при создании процессов.Когда я набираю «fg», он выводит первый фоновый процесс на передний план и ждет его.Но затем, если я нажимаю Ctrl-C, он закрывает оба процесса !!!!!!Он должен был только закрыть первый процесс и должен был ждать второго процесса !!!

Я искал везде, пробовал все, но не мог понять.Но проблема выглядит как со строкой 525. Когда я посылаю сигнал SIGCONT, он закрывает процесс.Но если прокомментировать эту строку, она не закрывается, но я также не могу использовать процесс, поскольку он остановлен !!!

У меня есть код в моем репозитории GitHub здесь: https://github.com/EmreKumas/Myshell

Спасибо за чтение ...

1 Ответ

0 голосов
/ 07 декабря 2018

Кажется, проблема вызвана группами процессов.Я только создавал разные группы процессов для фоновых заданий, но поскольку вы не можете изменить группу процессов дочернего процесса после того, как она выполнила команду exec, вам лучше сделать это в начале перед вызовом exec.Теперь проблема решена благодаря "@that other guy" и "@John Bollinger".

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