#c #signals #fork #posix #wait
#c #сигналы #fork #posix #подождите
Вопрос:
Как и сказано в названии, один процесс forks ожидает, что его дочерний элемент получит SIGSTOP (самостоятельно отправленный дочерним элементом), но он не просыпается после, как если бы он не получал никаких SIGCHLD (но на самом деле это было, проверено с помощью strace).
У кого-нибудь есть идеи?
int main() {
if (fork()) {
wait(NULL);
write(1, "Byen", 4);
} else {
kill(getpid(), SIGSTOP);
write(1, "Hellon", 6);
}
return 0;
}
Они оба зависают, тогда как только дочерний элемент должен.
Ответ №1:
В спецификации для wait
говорится, что он сообщает только о дочерних элементах, которые завершились, а не о дочерних элементах, которые остановились. Вы должны использовать
waitpid(-1, 0, WUNTRACED);
вместо этого.
Имя флага WUNTRACED
немного загадочно — почему это не так WSTOPPED
? Это точка, в которой стандартизированный wait*
API сталкивается с нестандартизированным ptrace
API. Сравните определение POSIX для WUNTRACED
…
- WUNTRACED
- Статус любых дочерних процессов, указанных pid, которые остановлены и о состоянии которых еще не сообщалось с момента их остановки, также должен быть сообщен запрашивающему процессу.
… с его документацией на странице руководства Linux …
- WUNTRACED
- также возвращает, если дочерний элемент остановился (но не отслеживается с помощью ptrace(2)). Статус для отслеживаемых дочерних элементов, которые остановились, предоставляется, даже если эта опция не указана.
Таким образом, в основном поведение по умолчанию wait*
имеет специальный случай, встроенный в него для удобства людей, пишущих отладчики (люди, пишущие отладчики, будут использовать все возможные удобства, которые они могут получить), и этот особый случай существует так долго, что это повлияло на имена, выбранные для waitpid
флагов. (Я не знаю так или иначе, но я не удивлюсь, узнав, что ptrace
остановки старше, чем остановки управления заданиями.)
Ответ №2:
упс, я отвечу сам, я забыл добавить WUNTRACED в качестве опции wait(). Правильный вызов функции — waitpid(-1, NULL, WUNTRACED);