LinuxForum.Fans
Тема

locks

Автор: richagok 4 сообщений 3495 просмотров
#383217

Всем привет.
Не могли бы вы помочь разобраться с одним вопросом, а именно: что будет если заблочить файл fcntl'ем, а на другом терминале cat'ом попытаться его читать?

Попробовал различные флаги, попробовал установить sgid бит на права доступа к файлу для mandatory блокировки, все равно читается.

вот код:

text
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) { struct flock *lock; int fd,err; lock=(struct flock*)malloc(sizeof(struct flock)); lock->l_type = F_WRLCK|F_RDLCK; lock->l_start=0; lock->l_whence = SEEK_SET; lock->l_len=0; lock->l_pid = getpid(); if ((fd = open("path", O_CREAT | O_RDONLY)) == -1) perror("open error"); if ((err=fcntl(fd, F_SETLKW, lock))==-1) { perror("fcntl error"); return EXIT_FAILURE; } puts("Проверка cat'a"); gets(); return EXIT_SUCCESS; }

#383347

flock'и нужны для взаимных блокировок на чтение/запись взаимодействующих процессов... т.е. по договорённости пере чтением/записью процесс из группы должен захватыватить блокировку, чтобы другие процессы не могли помешать ему выполнить его чёрное дело...

"richagok" написал:
Попробовал различные флаги, попробовал установить sgid бит на права доступа к файлу для mandatory блокировки, все равно читается.

как пишет тётя маня, для мандатных блокировок нужно ещё перемотировать с "-o mand" и запретить исполнение файла...

#384138

"richagok" написал:
что будет если заблочить файл fcntl'ем, а на другом терминале cat'ом попытаться его читать?
"richagok" написал:
все равно читается.
в Linux нет безусловных блокировок из коробки. И это не баг, а фича. Блокировки замедляют работу с файлами и делают невозможным многозадачность. Если блокировок нет (как в GNU/Linux), то с одним файлом могут работать сразу несколько процессов одновременно.

Если вам нужны блокировки, вы что-то делаете не так.
#384140

"Fat-Zer" написал:
как пишет тётя маня, для мандатных блокировок нужно ещё перемотировать с "-o mand" и запретить исполнение файла...
а ещё можно сгонять к мёртвому морю, набрать водички, соорудить дистиллятор, перегнать, и напиться дистиллированной воды(желательно добавить немного NaCl). Хотя проще налить из под крана, а если ваш водоканал не справляется, то отфильтровать и прокипятить.
Войдите или зарегистрируйтесь, чтобы ответить.