Как проверить, заблокирован ли файл или нет?
У меня есть следующий код, где я хочу проверить, заблокирован ли файл или нет. Если нет, то я хочу написать в него. Я запускаю этот код, выполняя их одновременно на двух терминалах, но я всегда получаю статус "заблокирован" каждый раз на обеих вкладках, даже если я не заблокировал его. Код ниже:
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
struct flock fl,fl2;
int fd;
fl.l_type = F_WRLCK; /* read/write lock */
fl.l_whence = SEEK_SET; /* beginning of file */
fl.l_start = 0; /* offset from l_whence */
fl.l_len = 0; /* length, 0 = to EOF */
fl.l_pid = getpid(); /* PID */
fd = open("locked_file", O_RDWR | O_EXCL | O_CREAT);
fcntl(fd, F_GETLK, &fl2);
if(fl2.l_type!=F_UNLCK)
{
printf("locked");
}
else
{
fcntl(fd, F_SETLKW, &fl); /* set lock */
write(fd,"hello",5);
usleep(10000000);
}
printf("\n release lock \n");
fl.l_type = F_UNLCK;
fcntl(fd, F_SETLK, &fl); /* unset lock */
}
2 ответа
Очень просто, просто запустите fnctl с F_GETLK вместо F_SETLK. Это установит данные в вашем указателе на текущее состояние блокировки, вы можете посмотреть, заблокирована ли она, открыв свойство l_type.
пожалуйста, смотрите: http://linux.die.net/man/2/fcntl для деталей.
Вам также нужно fl2
быть memset
до 0. В противном случае, когда вы используете fcntl(fd, F_GETLK, &fl2)
а также perror
в случае неудачи вы увидите сообщение как таковое на терминале:
fcntl: неверный аргумент
Я рекомендую вам использовать perror
, при отладке системных вызовов.