Как записать STDOUT фонового процесса без буферизации на Mac? - PullRequest
1 голос
/ 01 октября 2010

Я запускаю фоновый процесс на Mac и у меня проблема с обновлением журнала. Если я бегу

someprog > mylog &

затем mylog обновляется не сразу, но с некоторыми интервалами - я думаю, это связано с буферизацией. То же самое с at now. Если я убью программу до того, как вывод будет записан в mylog, я потеряю данные. Не было такой проблемы с той же программой на компьютерах с Linux, поэтому я надеюсь, что смогу сделать ее обновленной во время выполнения на Mac. Есть идеи как?

someprog - это программа F77, которая была написана не мной.

Я пытался задать этот вопрос в SuperUser, но никто не может мне помочь.

EDIT1: Мне не хочется менять источник, но имейте это в виду. Ведение журнала отлично работает на компьютерах с Linux, поэтому оно должно работать и на компьютерах Mac. Это должна быть системная настройка, например размер буфера? Для меня было бы хорошо ограничить размер буфера меньшим значением - теперь мне приходится часами ждать, чтобы что-то увидеть в журнале.

Ответы [ 2 ]

2 голосов
/ 01 октября 2010

Это обычное поведение программ на POSIX C, которые пишут в не-tty поток - я думаю, что F77 использует то же поведение или написано в терминах процедур stdio.

Я не знаю, какой правильный ответ - я думаю, вам нужно будет передать вывод через что-то, что притворяется, что это tty, но случайно я не знаю, что (если есть) утилита предоставляет эту опцию.

2 голосов
/ 01 октября 2010

Если у вас есть доступ к исходному коду, вы можете просто добавлять вызовы в fflush (stdout) после каждого printf.Если вы этого не сделаете, вы можете попробовать что-то хитрое с LD_PRELOAD ... По сути, создайте свою собственную версию printf (), которая вызывает libc для printf ... И выполняет сброс ... Затем LD_PRELOAD этой библиотеки при запуске ...Приложение будет использовать ваше вместо ... Вроде рискованно, хотя ...

...