setvbuf на STDOUT безопасно для других процессов?

Я использую HP-UX. Я хочу отключить буферизацию на стандартном выходе, чтобы каждая строка кода печаталась в случае дампа ядра с помощью следующей команды:

setvbuf(stdout, NULL, _IONBF, 0); // turn off buffering for stdout

В этом случае влияет ли это также на другие процессы, выводящие на стандартный вывод, который перенаправляется в какой-либо файл журнала? Я хочу знать, является ли это изменение только локальным для выполняемого процесса или нет. Кроме того, могу ли я отключить буферизацию в процессе, а затем снова установить _IO_FBF в коде? (flush перед каждым вызовом)

PS: я знаю, что это отключит буферизацию и ухудшит производительность ввода-вывода, но я хочу сделать это только в целях отладки.


person rApt0r    schedule 04.01.2012    source источник


Ответы (1)


Вызов setvbuf влияет только на подпрограммы stdio в текущем процессе и любые дочерние процессы, разветвленные, но не выполненные.

Как stdio реагирует, когда setvbuf вызывается несколько раз в одном и том же потоке, не указано в стандарте C, поэтому не выполняйте несколько вызовов в коде, который вы хотите перенести между реализациями C.

person Kyle Jones    schedule 05.01.2012
comment
Я пробовал это на линуксе. На самом деле, когда я печатаю что-то, делаю fflush() и устанавливаю размер буфера равным нулю, тогда это работает. Я вижу, что весь вывод есть на стандартном выводе до точки перед сбоем. Теперь проблема в том, что если я устанавливаю размер буфера на что-то большее, это не отражается, и я могу подтвердить, что стандартный вывод по-прежнему работает в небуферизованном режиме. Чтобы обойти это, я планировал закрыть (stdout) и снова открыть его. Однако имя файла для консоли, по-видимому, зависит от платформы ( /dev/pts/0 inlinux, /dev/stdout на hp-ux ). Любое простое решение, чтобы узнать источник для stdout и снова открыть его? - person rApt0r; 05.01.2012
comment
Проще использовать dup, чтобы понять, на чем открыт стандартный вывод. т.е. сделать этот танец: save = dup(1); fclose (стандартный вывод); дубликат (сохраненный); закрыть(сохранить); стандартный вывод = fdopen(1, w); Теперь у вас есть только что открытый stdout для stdio, указывающий на тот же файл/канал/устройство, что и раньше, но готовый принять новый вызов setvbuf. - person Kyle Jones; 05.01.2012