В двух словах: система посылает ваши программные сигналы, чтобы избавить вас от проблемы. Вы игнорируете эти сигналы. Плохие вещи случаются.
Когда ваша родительская программа была запущена, она имела stdin (fd 0), stdout (fd 1) и stderr (fd 2), подключенные к TTY оболочки, которая запускала вас (терминал). Они очень похожи на трубы. Когда вы закрываете терминал, эти fds остаются висящими, и никто с другой стороны не может общаться с ними.
Сначала ничего плохого не происходит. Вы пишете stderr, а стандартная библиотека кэширует эти записи. Системные вызовы не выполняются, поэтому проблем нет.
Но тогда буферы заполняются, и stdlib пытается их смыть. Когда он это делает, он заполняет буферы ядра для канала или TTY. Сначала это прекрасно работает. Рано или поздно, однако, эти буферы также заполняются. Когда это произойдет, ядро приостанавливает ваши процессы и ждет, когда кто-то прочитает с другого конца этих труб. Однако, поскольку вы закрыли терминал, никто никогда не будет, и ваши программы будут приостановлены на неопределенный срок.
Стандартный способ избежать этой проблемы - отключить дескрипторы файла 0-2 из управляющего TTY. Вместо того, чтобы рассказывать вам, как это сделать, я хотел бы предложить, что вы пытаетесь сделать здесь, запустить программу, чтобы она полностью отключилась от TTY, имеет имя: daemonizing.
Отъезд this вопрос для получения дополнительной информации о том, как это сделать.
Edited добавить:
Это было не ясно из вашей функции ли программы, вы execve
ИНГ ваши собственные или нет. Если это не так, помните, что многие пользовательские программы не предназначены для работы в качестве демона. Наиболее очевидным является то, что если программа, не связанная с каким-либо TTY, открывает файл TTY, и если он не передает O_NOCTTY
в open
, TTY становится управляющим TTY программы. В зависимости от обстоятельств это может привести к неожиданным результатам.
_Questions, ищущие помощь по отладке («почему этот код не работает?») Должен включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не полезны другим читателям. См.: Как создать минимальный, полный и проверенный пример ._ –
Вопрос уже дан. – Nidhoegger
Правильно, но все же, это должно быть полезно будущим читателям. Пояснение не требуется, ИМХО. –