C语言 FCNTL 返回 errno - 无效参数



我不知道为什么我的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()存储。

相关内容

  • 没有找到相关文章

最新更新