#linux #unix #csh
#linux #unix #csh
Вопрос:
Я реализовал простую оболочку c для приема таких команд, как sleep 3 amp;
. Я также реализовал его для «прослушивания» сигналов sigchild после завершения задания.
Но как мне распечатать идентификатор задания и команду, как в оболочке ubuntu, после его завершения?
Ответ №1:
Я бы посоветовал не перехватывать SIGCHLD
сигналы.
Более аккуратный способ сделать это — вызвать waitpid
с WNOHANG
помощью опции. Если он возвращается 0
, вы знаете, что задание с этим конкретным pid все еще выполняется, в противном случае этот процесс завершен, и вы извлекаете его код выхода из status
параметра и печатаете соответствующее сообщение.
Более того, bash не печатает статус завершения задания во время завершения задания, а скорее во время выдачи следующей команды, так что это идеально подходит для waitpid
.
Небольшим недостатком этого подхода является то, что процесс задания будет оставаться как зомби в период между его завершением и временем, когда вы вызываете waitpid
, но это, вероятно, не должно иметь значения для оболочки.
Ответ №2:
Вам нужно запомнить дочерний pid (из fork) и команду, выполняемую в вашей оболочке (в какой-то таблице или структуре карты). Затем, когда вы получаете SIGCHILD, вы находите дочерний pid, и это дает вам соответствующую команду.