Я использую пары pty / tty в стиле BSD для реализации вспомогательной оболочки. Когда пользователь выходит из подчиненной оболочки, как мне определить в главном процессе, что это произошло? Я использую select (nfds, & read_fds, NULL, NULL, & timeout); с дескриптором файла master pty, установленным в read_fds на стороне master.





Подоболочка обычно создается каким-либо fork(). PID дочернего элемента возвращается мастеру, который может проверить (возможно, с помощью waitpid()), работает ли он еще.
Я нашел ответ на этот вопрос, изучив исходный код telnetd из пакета GNU inetutils. В telnetd они используют такой обработчик SIGCHLD:
int status;
pid_t pid = waitpid((pid_t)-1, &status, WNOHANG);
syslog (LOG_INFO, "child process %ld exited: %d",
(long) pid, WEXITSTATUS(status));
// do cleanup code