Написание оболочки в c, вопрос о значении ($?) - PullRequest
0 голосов
/ 21 июня 2020

Я работаю над написанием оболочки на c. Одна из моих сборок, которую я должен реализовать, - «эхо». Интересно, как мне получить значение $? если бы моя команда была такой как 'ls filename; эхо $? '. В этом случае мне нужно использовать fork для создания нового процесса и использовать execv для запуска двоичного ls в системе после выполнения ls, как мне узнать статус выхода ls?

Ответы [ 2 ]

1 голос
/ 21 июня 2020

После вызова fork родительский процесс должен дождаться завершения дочернего процесса. Скорее всего, это делается с использованием waitpid. Когда он вызывает waitpid, он может передать указатель в ячейку памяти, где он хочет получить «информацию о состоянии» дочернего процесса, включая его статус выхода. См. документацию waitpid для получения подробной информации о том, как интерпретировать «информацию о состоянии».

0 голосов
/ 21 июня 2020

Вместо ожидания определенного PID вы можете дождаться любого PID несколькими способами. Вы можете установить обработчик сигнала для SIGCHLD и в вызове обработчика wait(&status), и он вернет PID и сохранит статус выхода процесса.

Или вы можете установить обработчик сигнала, используя sigaction и SA_SIGINFO флаг. Тогда обработчик сигнала будет иметь расширенную подпись, которая включает параметр siginfo_t*, а для сигнала SIG_CHLD он будет содержать PID и статус.

Или вместо обработчика сигнала вы можете использовать wait или waitpid (с PID -1) для ожидания любого процесса, и он вернет PID того, какой из них завершился. Предполагая, что ваша программа отслеживает, сколько дочерних элементов она разветвлена, вы должны обработать этот выход процесса и go вернуться к ожиданию того, что будет дальше.

Ожидание любого выхода важно, если в вашей оболочке есть управление заданиями, которое позволяет запуск и отслеживание состояния любого количества фоновых процессов.

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