Ядро linux 2.6.18Собственно subj.
Собираю тестовое приложение lock: cc -Wall lock.c -o lock
Создаю тестовый файл: echo "TEST" > testfile
C 2-х терминалов запускаю: ./lock testfile
Удивительно, но оба процесса ставят исключительную блокировку по записи на весь файл,
хотя по теории может только один. Что не так?
Пример кода приложения lock.
/*
* lock.c
* cc -Wall lock.c -o lock
*/
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>int
main (int argc, char * argv[])
{
int j;
int fd;
char buffer[2];
struct flock lock;
for (j=1; j < argc; j++) {
fd = open(argv[j], O_WRONLY, 0644);
if (fd < 0) {
fprintf (stderr, "Невозможно открыть %s\n", argv[j]);
exit(EXIT_FAILURE);
}
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
lock.l_pid = 0;
if (fcntl (fd, F_SETLK, & lock) < 0) {
fprintf (stderr, "Невозможно заблокировать %s\n", argv[j]);
exit(EXIT_FAILURE);
}
} // for
fprintf (stdout, "Нажмите Ввод для снятия блокировки(ок)\n");
fgets (buffer, 2, stdin);
exit(EXIT_SUCCESS);
}