Оболочка C — получение заданий в фоновом режиме для отчета о состоянии после выполнения

#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, и это дает вам соответствующую команду.