Страницы

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

пятница, 20 декабря 2019 г.

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

#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

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

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