我无法弄清楚为什么我的fcntl一直说“无效的参数”。请帮忙。如果我理解正确,我应该用我指向要检查的字节的数据填充我的羊群(我传递给fcntl的那个)。
int byteno;
printf(ANSI_COLOR_BLUE "Insert byte number: " ANSI_COLOR_RESET);
scanf("%d\n", &byteno);
struct flock* fl = malloc(sizeof(flock));
fl -> l_type = F_GETLK;
fl -> l_whence = SEEK_SET;
fl -> l_start = byteno;
fl -> l_len = 1;
fl -> l_pid = getpid();
if(fcntl(descr, F_GETLK, fl) == -1){
perror(ANSI_COLOR_RED "Error while getting info about locks" ANSI_COLOR_RESET);
free(fl);
continue;
}
if(!(fl -> l_type == F_UNLCK)){
printf(ANSI_COLOR_YELLOW "Other proccess has a lock here. PID = %d" ANSI_COLOR_RESET, fl -> l_pid);
continue;
}
答案 0 :(得分:3)
F_GETLK(struct flock *)
在输入此调用时,lock描述了我们想要放在文件上的锁。 如果可以放置锁,则fcntl()实际上不会放置它,但会在锁的l_type字段中返回F_UNLCK并保持结构的其他字段不变。如果一个或多个不兼容的锁会阻止放置此锁,然后fcntl()返回锁的l_type,l_whence,l_start和l_len字段中的其中一个锁的详细信息,并将l_pid设置为持有该锁的进程的PID。
F_GETLK
不用于获取有关锁定的信息,而是用于“测试是否应用指定的锁定”。
尝试以下示例。在5秒钟的窗口内运行两次。
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
void main(void) {
int fd;
struct flock fl_info;
int ret;
fd = open("./test.txt", O_RDWR | O_CREAT, 0600);
if (fd == -1) {
perror("open()");
return;
}
memset(&fl_info, 0, sizeof(fl_info));
/* try to get a WRITE lock on the entire file (l_len == zero) */
fl_info.l_type = F_WRLCK;
fl_info.l_whence = SEEK_SET;
fl_info.l_start = 0;
fl_info.l_len = 0;
ret = fcntl(fd, F_GETLK, &fl_info);
if (ret == -1) {
perror("fcntl(F_GETLK)");
return;
}
if (fl_info.l_type != F_UNLCK) {
printf("Too bad... it's already locked... by pid=%d\n", fl_info.l_pid);
return;
}
/* try to apply a write lock */
fl_info.l_type = F_WRLCK;
ret = fcntl(fd, F_SETLK, &fl_info);
if (ret == -1) {
perror("fcntl(F_SETLK)");
return;
}
printf("Success!\n");
sleep(5);
printf("I'm done, bye!\n")
return;
}
另请注意,malloc()
无需struct flock
存储。