首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FCNTL返回errno -无效参数。

FCNTL返回errno -无效参数。
EN

Stack Overflow用户
提问于 2017-03-19 19:20:02
回答 1查看 892关注 0票数 0

我不明白为什么我的fcntl总是说“无效的论点”。拜托救救我。如果我正确理解它,我应该用指向我要检查的字节的数据填充我的羊群(我传递给fcntl的那个)。

代码语言:javascript
复制
  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;
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-19 19:33:30

F_GETLK (struct *) 在此调用的输入中,lock描述了我们希望放置在文件上的锁。如果可以放置锁,fcntl()实际上不会放置锁,而是在锁的l_type字段中返回F_UNLCK,并将结构的其他字段保持不变。如果一个或多个不兼容的锁将阻止此锁放置,则fcntl()返回关于锁的l_type、l_whence、l_start和l_len字段中的一个锁的详细信息,并将l_pid设置为持有该锁的进程的PID。

F_GETLK不用于获取有关锁的信息,而是用于“测试应用指定的锁是否有效”。

尝试下面的示例。在5秒窗口内运行两次。

代码语言:javascript
复制
#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并不是必要的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42891065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档