Я использую fcntl()
для захвата файла, а затем вызываю execlp()
, чтобы открыть файл с помощью nano. Я запускаю программу здесь и в другом сеансе. Процесс из новой сессии также открывает файл с помощью nano, но он должен ждать разблокировки. Эффект одинаков для принудительной и рекомендательной блокировки.
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#define editor "nano"
int main(int argc, char *argv[]) {
struct flock lock;
int fd;
if ((fd = open(argv[1], O_RDWR)) == -1) {
perror("Cannot open file");
exit(EXIT_FAILURE);
}
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
if (fcntl(fd, F_SETLKW, &lock) == -1) {
perror("fcntl failed");
exit(EXIT_FAILURE);
}
execlp(editor, editor, argv[1], NULL);
perror("exec is not working");
exit(EXIT_FAILURE);
}
Мужчина: Новый процесс также наследует следующие атрибуты от вызывающего процесса: ... файловые блокировки (см. fcntl(2) и lockf(3C))
Как это возможно?