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