LINUX.ORG.RU

write() O_APPEND


0

0

Несколько процессов открывают файл (log-файл) на локальной ФС в режиме O_APPEND и пишут туда с помощью write() небольшие строки (100-200) байт. Может ли в этом файле возникнуть "каша", если считать, что процессам сигналы не приходят?

Рассматривается ситуация только в Линуксе, поведение других ОС не интересует.

Попробовал потестировать, вроде даже если писать строки по 5 Мбайт, то пока write() одного процесса не закончится, другой write() не выполняется ...

Вопрос можно переформулировать так: В каких случаях, кроме посылки сигнала, в Линуксе write() в файл на локальной ФС запишет байт меньше указанного числа?

★★★★★

>Может ли в этом файле возникнуть "каша", если считать, что процессам >сигналы не приходят?

В цепочке write -> sys_write ->...
берется семафор(мьютекс?) inode, так что одновременно писать
может только один процесс,
по-моему даже предпринимались попытки сделать безапасной запись из нескольких потоков - не помню чем закончилось.

fghj ★★★★★
()

>В каких случаях, кроме посылки сигнала, в Линуксе write() в файл на >локальной ФС запишет байт меньше указанного числа?

место кончится, сбойный блок, да много чего.

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

>>по-моему даже предпринимались попытки сделать безапасной запись из >>нескольких потоков

??

Все системные вызовы работы с файлами - thread-safe. Этого требуeт POSIX.

Motl
()

> Вопрос можно переформулировать так: В каких случаях, кроме посылки
> сигнала, в Линуксе write() в файл на локальной ФС запишет байт меньше
> указанного числа?

IMHO при write() с O_APPEND в локальный файл вывод разных процессов
не смешивается.

AFAIK кроме того write() в локальный файл не считается "медленной"
операцией и write() не будет прерывана сигналами.

HTH

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

Спасибо за ответы.

>AFAIK кроме того write() в локальный файл не считается "медленной" операцией и write() не будет прерывана сигналами.

Да, написал тестовые программы, и read(), и write() на локальный файл переводят процесс в состояние uninterruptible sleep, пока не будет завершена операция чтения/записи (даже если файл открывать с O_NONBLOCK). Если файл на NFS ситуация аналогичная. (проверял для ядра 2.4.32).

Где можно узнать, какие вызовы в Линукс считаются "медленными", а какие "быстрыми" (не прерываемыми сигналами)? И меняется ли это деление от версии (ветки) ядра?

В google по этом вопросу сходил, нашел только в http://www.win.tue.nl/~aeb/linux/lk/lk-4.html

>(So, what is "slow"? Mostly those calls that can block forever waiting for external events; read and write to terminal devices, but not read and write to disk devices, wait, pause.)

ИМХО, это расплывчато...

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

>AFAIK кроме того write() в локальный файл не считается "медленной" операцией и write() не будет прерывана сигналами.

Хотя бы HUP INT QUIT TERM TSTP неплохо бы и вручную обрабатывать. А вообще неплохо бы потестировать со строками большего размера. Вот bash точно делает кашу даже при двух процессах.

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

> Где можно узнать, какие вызовы в Линукс считаются "медленными", а
> какие "быстрыми" (не прерываемыми сигналами)?
>

"Медленные" это те, которые могут устанавливать EINTR.
Остальные соответственно "быстрые".
Смотри соответствующие man-pages ;-)

Но в общем это достаточно интуитивно - если системный вызов может
блокироваться на неопределенное (потенциально бесконечное) время,
зависящее от внешних обстоятельств - это скорее всего "медленный"
вызов.

Никакого "официального списка" таких вызовов я не знаю... и в общем-то
потребности в нем в реальной жизни не испытываю :-)

HTH

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

> Хотя бы HUP INT QUIT TERM TSTP неплохо бы и вручную обрабатывать.

Ну дык никуда твой сигнал не денется! Просто твой процесс получит его
после завершения системного вызова.

HTH

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