LINUX.ORG.RU

Что будет со стандартным потоком вывода после вызова fork()

 , ,


0

1

т.е. имеем код в котором код, в котором после вызова fork(), имеется много функций printf(). Куда будет перенаправляться вывод printf и какие из этого могут быть последствия?

★★

Последнее исправление: andreykyz (всего исправлений: 1)
       *  Потомок   наследует  копии  набора  открытых  файловых  дескрипторов
          родителя. Каждый файловый дескриптор в потомке ссылается  на  то  же
          описание  файла  что и родитель (см. open(2)). Это означает, что два
          дескриптора совместно используют флаги  состояния  открытого  файла,
          текущее   смещение   файла   и  атрибуты  ввода-вывода,  управляемые
          сигналами (смотрите описание F_SETOWN и F_SETSIG в fcntl(2)).

(c) man 2 fork

Deleted
()

Тест написать 5 минут займет, нет, надо создать тему...

anonymous
()

туда же, куда и от родительского процесса

Harald ★★★★★
()

А что будет с printf до fork не интересует?

#include <stdio.h>

main()
{
        printf("Before fork ");
        fork();
        printf("After fork\n");
}

Результат:

$ ./forkp 
Before fork After fork
Before fork After fork

io ★★
()
Ответ на: комментарий от io

Остается еще, чтобы вопрошаемый правильно ответил, не забывая, что fork копирует и все буферы вместе с их содержимым.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Eddy_Em

Остается еще, чтобы вопрошаемый правильно ответил, не забывая, что fork копирует и все буферы вместе с их содержимым.

типа того:

#include <stdio.h>

main()
{
        printf("Before fork ");
        fflush(stdout);
        fork();
        printf("After fork\n");
}

andreykyz ★★
() автор топика
Ответ на: комментарий от andreykyz

Лучше перед форком вообще делать fflush(NULL), а то — мало ли, вдруг в stdin или файловом потоке данные «застряли».

Eddy_Em ☆☆☆☆☆
()

printf после fork() это моветон, я считаю, перенапрявляй вывод в файл что ли (man dup2 например)... К тому же, сискол write, как тут умные люди говорили, атомарен при записи данных менее или равными 512 байт, так что есть надежда, что эта операция не будет вытеснена другим процессом.

Dennis7
()
Ответ на: комментарий от Eddy_Em

На самом деле у меня есть вызов в потомке, функции, с большим количеством printf(). Решил остановиться на перенаправлении всего этого в /dev/null

Вот такой код в потомке:

     int stdout_file = open("/dev/null", O_RDWR);
     if (dup2(stdout_file, STDOUT_FILENO) == -1)
     {
         exit(0);
     }
     close(stdout_file);
больше ничего не надо?

andreykyz ★★
() автор топика
Ответ на: комментарий от Dennis7

=)

printf после fork() это моветон, я считаю

Предлагаешь запретить вызов printf во всех процессах с (pid != 1)?

Deleted
()
Ответ на: комментарий от andreykyz

Чисто в академических целях... open может вернуть ошибку. А так... сойдет.

Хотя отсутствие /dev/null в системе будет говорить о «неадекватности» самой системы, но ... на всё воля ядра и разработчиков.

Dennis7
()
Ответ на: =) от Deleted

Не, я такое не предлагаю.

Но у меня другой вопрос: а зачем форкаться с принтфом? Если это не лаба в универе?

Dennis7
()
Ответ на: комментарий от Dennis7

Dennis7

Но у меня другой вопрос: а зачем форкаться с принтфом? Если это не лаба в универе?

Затем чтобы не писать все заново я юзаю чужой код который когда-то являлся неитерактивной утилитой аля ls. Все свои логи я вывожу через syslogd, вот я и задумался.

andreykyz ★★
() автор топика
Ответ на: комментарий от andreykyz

А! Так ты демон пишешь. Тем более printf'ы не нужны. Где ты видел, чтобы более или менее нормальный демон (нормально разработанный) писал бы в stdout или в stderr?

Dennis7
()
Ответ на: комментарий от Eddy_Em

см ответ Dennis'y . в двух словах. Я использую всю мощь открытых исходников на благо мира. Потом перепишу, сейчас просто нужно рабочий образец, вот и использую чужой код.

andreykyz ★★
() автор топика
Ответ на: комментарий от andreykyz

Открой другую консоль. Затем: tail -f /var/log/your_log_filename <Enter>

Dennis7
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.