我不知道为什么我的fcntl一直说"无效参数"。请帮忙。如果我理解正确,我应该用指向我要检查的字节的数据填充我的羊群(我传递给 fcntl 的那个(。
int byteno;
printf(ANSI_COLOR_BLUE "Insert byte number: " ANSI_COLOR_RESET);
scanf("%dn", &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;
}
F_GETLK(结构植群*(
在此调用的输入中,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=%dn", 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;
}
另请注意,没有必要为struct flock
malloc()
存储。