Если ваш ребенок умирает в результате сигнала, он не сбрасывает буферы, поэтому вы не видите выходных данных. Есть решения для этого
- Обработка сигнала и очистка буферов
- Использовать небуферизованный ввод / вывод (следует избегать этого)
- Синхронизируйте дочерний элемент и родительский элемент (используя канал) (чтобы родитель знал, что его можно убить).
Конечно, третий вариант довольно глуп: ребенок, сигнализирующий родителю, может быть заменен простым выходом.
Редактировать
В свете отредактированного вопроса и комментариев
stdio
(printf, fwrite и т. Д.), Из соображений эффективности ввода / вывода используются некоторые буферы. То есть, когда вы делаете простую запись, операция низкого уровня не происходит сразу. Данные копируются в некоторый буфер, и позже, когда библиотека сочтет это необходимым (полные буферы или что-то еще), буферы будут сброшены - материал будет записан.
Теперь, когда программа вызывает exit(3)
(обычное завершение процесса), происходит то, что буферы stdio
сбрасываются. Если программа умирает в результате сигнала, буферы stdio
не очищаются, а память просто запрашивается ОС.
Если у вас нет контроля над программами, которые вы exec
(скажем, вы оболочка) не можете быть уверены, что они сделают свое дело, если вы их убьете. То есть это не ваша ответственность. Однако если вы do контролируете их (вы сказали что-то о канале), вы можете просто передать через канал некоторую последовательность, которая заставит детей вызывать exit(3)
.