Обработка сигнала и ожидание сосуществуют
Я пишу оболочку на C, которая должна поддерживать фоновые и передние процессы.
Ограничения:
- Фоновые процессы, которые завершаются, должны быть перехвачены обработчиком сигнала
- Нельзя использовать глобальные переменные для связи с обработчиком сигнала.
- Нет списка процессов / пидов, разрешенных
Мое решение:
- Waitpid до завершения процесса переднего плана
- Для фоновых процессов немедленно вернитесь к приглашению
- Обработчик перехватывает SIGCHLD, где waitpid используется для очистки таблицы процессов
Проблема:
- Процессы переднего плана также запускают обработчик, вызывающий ошибку одного из двух ожиданий
- Не удается решить, игнорируя SIGCHLD во время выполнения процесса переднего плана, поскольку фоновый процесс может прекратиться в течение этого времени
- Не удается найти способ заставить обработчик игнорировать определенный pid (запущен процесс переднего плана)
Спасибо!
1 ответ
Проблема:
- Процессы переднего плана также запускают обработчик, вызывающий ошибку одного из двух ожиданий
Это не проблема - просто оставьте обработчик.
void handler(int signum)
{
pid_t pid;
while (pid = waitpid(-1, NULL, WNOHANG), pid > 0)
fprintf(stderr, "%d terminated\n", pid);
}