Оболочка C - получение заданий в фоновом режиме для отчета о состоянии после выполнения - PullRequest
1 голос
/ 24 октября 2011

Я реализовал простую оболочку c, чтобы принимать такие команды, как sleep 3 &.Я также реализовал его для «прослушивания» сигналов sigchild после завершения задания.

Но как мне получить идентификатор задания и команду, которые будут распечатаны, как оболочка ubuntu, после ее завершения?

Ответы [ 2 ]

1 голос
/ 24 октября 2011

Я бы не советовал ловить SIGCHLD сигналы.

Более точный способ сделать это - вызвать waitpid с опцией WNOHANG. Если он возвращает 0, вы знаете, что задание с этим конкретным pid все еще выполняется, в противном случае этот процесс завершится, и вы получите его код выхода из параметра status и распечатаете сообщение соответствующим образом.

Более того, bash не печатает состояние завершения задания во время его завершения, а скорее во время выполнения следующей команды, так что это идеально подходит для waitpid.

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

0 голосов
/ 24 октября 2011

Вам нужно запомнить дочерний pid (из форка) и команду, выполняемую в вашей оболочке (в какой-то структуре таблицы или карты).Затем, когда вы получите SIGCHILD, вы найдете дочерний pid, и это даст вам соответствующую команду.

...