Страницы

Поиск по вопросам

пятница, 9 ноября 2018 г.

Задача по программированию в *nix'ах

Коллеги! Еще одна забавная задача по программированию в Unix. Вот такой код #include #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-ы м.б. разными).

Комментариев нет:

Отправить комментарий