LINUX.ORG.RU

Вопрос по man fcntl, что бы оно значило...


0

0

Делаею man fcntl, там в разделе Mandatory locking есть предложение: Advisory locks are not enforced and are useful only between cooperating processes.

Чтобы означает термин cooperating processes? Допустим имеем несколько процессов, как их можно скооперировать? Что порд этим понимается?


Шо ж тут непонятного ... если некий процесс не проверяет локи, то ему ничто не мешает читать/писать.

Соответственно, процессы являются cooperative если согласованно ставят/анализируют локи.

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

Тогда чем отличается Advisory locking от Mandatory locking?

Процессы в обоих случаях могут блокировать файлы.

Мне не понятно, что это за свойство кооперативности у процессов. То что они могут блокировать файлы это понятно. Но я упор не вижу разницы в функционировании Advisory locking и Mandatory locking.

Mandatory locking отличается от Advisory locking только:

Advisory locks are not enforced and are useful only between cooperating processes.

Ну ещё отличие:

If the O_NONBLOCK flag is not enabled, then system call is blocked...

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

> Тогда чем отличается Advisory locking от Mandatory locking?

При Mandatory locking блокировки накладываются/анализируются еще и функциями read/write. Это означает, что если одно приложение получило монопольный доступ к некоторому куску файла с помощью fcntl, то второе приложение этот кусок не сможет прочесть, даже если ни о каких явных блокировках оно не заботится вообще.

Я думаю, что ответы на такие вопросы лучше искать в какой-нибудь википедии, чем в мануале по libc.

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

> Я думаю, что ответы на такие вопросы лучше искать в какой-нибудь википедии, чем в мануале по libc.

А еще лучше - в стандартах типа POSIX или SUS

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

Всем спасибо, буду рыть.

Тут выяснилась такая штука. Когда я тестировал sys_waitpid с флагами WUNTRACED и WCONTINUED всё было красиво. Дитё останавливалось по сигналу и стартовала по сигналу, sys_waitpid возращал корректное значение pid по каждому из флагов. Но когда дитё стопорнулось на write, получилось, что sys_waitpid не реагирует на изменение состояния детёныша, а реаг\ирует только когда детёныш завершается.

Это я торможу или waitpid с флагами WUNTRACED, WCONTINUED обнаруживает изменение состояние только, когда детёнышу посылают SIGSTOP и SIGCONT соответсвенно?

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

должен ли waitpid реагировать на изменение состояние детёныша, если он блокируется на write?

Имеется ввиду, что write блокируется на файле, который соответсвенно блокируется/разблокируется по fcntl другим процессом.

yantux
() автор топика
Ответ на: комментарий от tailgunner

Я ожидаю, что при если write блокируется на файле, заблокированном н другим процессом fcntl-ем, то waitpid должен возращать изменение состояние детёныша, так же как и по разблокировке файла fcntl-ем, waitpid должен возращать изменение состояния. Пока этого нет.

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

> Я ожидаю, что при если write блокируется на файле, заблокированном
> н другим процессом fcntl-ем, то waitpid должен возращать изменение
> состояние детёныша, так же как и по разблокировке файла fcntl-ем,
> waitpid должен возращать изменение состояния. Пока этого нет.
>

Куча заблуждений и полное непонимание в одной фразе :-(

1. waitpid() сработает если процесс завершился или (если просили
WUNTRACED) процесс остановлен, то есть получил сигнал SIGTTIN,
SIGTTOU, SIGTSTP, или SIGSTOP. Если же процесс заблокирован (не
путать с "остановлен"!) в каком-то системном вызове (например write)
то это не имеет _никакого_ отношения к waitpid().

2. Advisory блокировка fcntl() _никак_ не влияет на возможность
доступа других процессов к файлу. Другие процессы должны (если
хотят "кооперации") также использовать fcntl() для установки/снятия
блокировок перед тем, как делать свои read/write/что-то-еще.

Короче, Стивенса почитай, что-ли...

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