FCNTL返回errno - 参数无效

时间:2017-03-19 19:20:03

标签: c unix operating-system fcntl

我无法弄清楚为什么我的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;
  }

1 个答案:

答案 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存储。