Обработка сигнала и ожидание сосуществуют

Я пишу оболочку на 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);
}
Другие вопросы по тегам