stderr в файл; но без буферизации - PullRequest
1 голос
/ 27 мая 2010

Я пытаюсь изолировать неприятную ошибку, которая сбивает мое ядро ​​Linux. Я печатаю сообщения в stderr, и stderr перенаправляется в файл журнала. Есть ли способ отключить буферизацию при доступе к файлу? Когда ядро ​​зависает, я теряю сообщения в буфере.

Ответы [ 3 ]

1 голос
/ 27 мая 2010

На самом деле, stderr небуферизован по умолчанию, но я думаю, что это только с точки зрения времени выполнения Си. Мы решили это раньше с помощью:

fflush (stderr); fsync (fileno (stderr));

(хотя мы на самом деле сделали это stdout, но применяются те же правила - фактический fflush может не понадобиться для stderr, но это не причиняет вреда).

fflush сбрасывает буферы времени выполнения C в ОС, fsync принудительно записывает на диск.

Имейте в виду, что это может серьезно повлиять на вашу производительность.

0 голосов
/ 27 мая 2010

Вы можете попробовать использовать setvbuf при запуске приложения

setvbuf(stderr, NULL, _IONBF, 0);

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

Можете ли вы использовать последовательную консоль и получить вывод на другом компьютере? Таким образом, вы могли бы получать сообщения как oops, так и stderr

0 голосов
/ 27 мая 2010

Вы можете принудительно очистить буфер, используя fflush(stderr);

...