Коллеги! Еще одна забавная задача по программированию в Unix.
Вот такой код
#include
int main() {
std::cout << "HELLO ";
fork();
}
Что эта программа будет выводить и почему?
Ответ
В c++ cout << , в C printf () выводят в stdout. Реально данные пишутся в буфер. Буфер выталкивается (системный вызов write()) на устройство для stdout и tty (консоль) по '
', если конечно ранее принудительно не задавали другой тип буферизации (например unbuffered). IMHO функции setbuf(), setlinebuf() и т.п. см. man -k ...
А вот '
'-то и нет !
В твоем примере сразу за записью в буфер идет fork(). Порождается новый процесс, все данные дублируются (ну, я не буду о pid, ppid и подобном), а вызов fork() возвращает свой результат в одну и ту же точку в обоих процессах. Далее процессы исполняют независимо друг от друга одну и ту же программу.
Естественно оба в конце концов (по окончании main) делают write(1,"HELLO ",7); т.е. выталкивают буфер на устройство. Точно не знаю, но думаю, что был вызов atexit(), в котором запланирован вызов функции fflush(), выталкивающей буфера по окончании main().
Насколько помню, чтобы избежать этого (похоронить данные в буферах) надо явно вызвать _exit().
IMHO понятно (в некоторых деталях мог ошибиться, пишу по памяти, да и *nix-ы м.б. разными).
Комментариев нет:
Отправить комментарий