LINUX.ORG.RU

C + куча процессов + логи


0

0

Здравствуйте. Я тут как то задавал вопрос про логи, вот сейчас хочу уточнить:

родительский процесс открывает 3 разных лога в режиме "a", и начинает запускать дочерние процессы, которые туда кидают несколько строк. Для всех логов делалось

setvbuf(stdout, NULL, _IONBF, 0);

(stdout перенаправляется). Но возникла маленькая проблемка при большом количестве процессов - в логах бывают повторяющиеся строки, что исключено. Может еще надо делать fflush(NULL) ?

anonymous

>Может еще надо делать fflush(NULL) ?

не может а надо причём непосредственно перед fork()

cvv ★★★★★
()

> Может еще надо делать fflush(NULL) ?

по идее, нет, раз у вас _IONBF. но зачем вам вообще
в таком случае пользоваться stdio?

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

>по идее, нет, раз у вас _IONBF.

здесь ты как всегда прав

>но зачем вам вообще в таком случае пользоваться stdio?

возможно ради форматированного в/в. человек наверное не знает про snprintf() а может хочет побыстрее и попроще.

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

Если честно я не аонял что не так с stdio ? (вы про библиотеку?). Ну мне она нужна ради того же printf()

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

Основной фичей stdio является буферизация которую ты выключил после чего в ней(stdio) нет особого смысла. Проще юзать read()/write() напрямую а не через врапперы. мессаги в етом случае целесообрано форматировать при помощи snprintf(). Можешь получить существенный прирост производительности. Кажись так. Если нет to idle надеюсь поправит.

cvv ★★★★★
()

Я писал в пример

setvbuf(stdout, NULL, _IONBF, 0);

для того, чтобы задающий вопрос почиал man'ы и info libc и разабрался с поточным выводом... Отказ от буферизации потоков это так, для отладки, а не для рабочей программы...

В любом случае, ИМХО, нет ничего хорошего в том, что несколько процессов пишут в один файл одновременно (write() не атомарна), хотя может я не правильно понял условия.

mky ★★★★★
()

чувак не позорься не надо всем в один файл писать. или напеши сервер который будет получать строки через сокеты от всех процессов и писать их в файло последовательно, или используй готовый klogd.

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

> чувак не позорься не надо всем в один файл писать.

и чем это плохо?

> или напеши сервер который будет получать строки через
> сокеты от всех процессов и писать их в файло последовательно

и чем это лучше?

> или используй готовый klogd.

для многих ситуаций он не так уж и готов.

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

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

Я слышал что ето верно только если блок меньше 4Кб. Если больше то нет. На ету тему какието соображения есть??

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

> Я слышал что ето верно только если блок меньше 4Кб.

я тоже это слышал. вообще-то я в этом не очень
хорошо разбираюсь, но насколько я могу судить
в VFS sys_write atomic всегда, под i_sem.

другое дело, что ничто не мешает конкретной fs
сбросить этот семафор... не знаю, делает ли кто
так. куда этот Murr подевался?

вот read() - _не_ atomic.

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

idle wrote:
> не знаю, делает ли кто так.
> куда этот Murr подевался?

поднимаю ветку, чтобы Murr заметил и подтвердил/опроверг.

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