LINUX.ORG.RU

locks

 


0

2

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

#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
    struct flock *lock;
    int fd;
    lock->l_type=F_WRLCK;
    if ((fd = open("path", NULL)) == -1)
        perror("open error");
    fcntl(fd, F_SETLKW, lock);
    return EXIT_SUCCESS;
}

До тех пор, пока не заключишь код в [code=c][/code], тут тебе никто не поможет.

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

анон, да сейчас форматируй-не форматируй - все с отпусках, кто помогать-то будет ;)

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

Не проверял, но в man'е написано:

To make use of mandatory locks, mandatory locking must be enabled both on the file system that contains the file to be locked, and on the file itself. Mandatory locking is enabled on a file system using the "-o mand" option to mount(8), or the MS_MANDLOCK flag for mount(2)...

Второе, что это такое:

struct flock *lock;
ведь есть же в инете примеры вызова fcntl. Ведь под структуру должна быть выделена память, и в структуре должна быть указана область блокировки файла.

Ну и третье, непонятно почему у вас нет паузы в конце main(). Блокировки ведь существуют пока живёт процесс. Как вы успеваете запустить ″cat″, если ваш main() делает сразу return EXIT_SUCCESS?

P.S. Почему тема в Security, а не в Development?

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

Я просто пробовал разные сочетания флагов, это последний вариант, всегда читается.

richagok ()
Ответ на: комментарий от richagok
#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;
}
richagok ()
Ответ на: комментарий от richagok

И, что, не работает? ФС перемонтировали?

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