gpt4 book ai didi

c - 为什么 fcntl() 不阻塞 WSL 中的 F_SETLKW?

转载 作者:太空宇宙 更新时间:2023-11-03 17:03:22 25 4
gpt4 key购买 nike

我试图找出在 Linux 中锁定文件的不同类型的方法,我刚刚遇到了 fcntl()。

根据手册页,如果文件上持有冲突锁,fcntl() 和 F_SETLKW 应该会阻塞。所以我创建了以下代码片段并在两个终端上运行。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>

//lock.c is the file name
void lock() {
struct flock fl;

fl.l_type = F_WRLCK;
fl.l_len = 10;
fl.l_start = 0;
fl.l_whence = SEEK_SET;
fl.l_pid = getpid();

int fd1 = open("lock.c", O_RDWR);
printf("Try to set the lock!\n");
int res = fcntl(fd1, F_SETLKW, &fl);
printf("Set the lock with status: %d\n", res);

sleep(20);
}

int main(void)
{
lock();
}

我的预期结果是第一个进程应该立即打印出两行,而第二个进程应该只打印出第一行并等待第一个进程完成休眠然后打印出第二行。

但事实证明,这两个进程都立即打印出这两行并开始休眠。是我误解了 fcntl() 的工作原理还是代码中存在错误?

$./lock
Try to set the lock!
Set the lock with status: 0

最佳答案

好的,我想我找到了问题所在。我将 WSL 2(昨天更新)与 Windows 10 商店的 Ubuntu 子系统一起使用。而且 fcntl() 在 WSL 中不支持/有错误 F_SETLK,但是。这是相当长一段时间以来的已知问题。

https://github.com/Microsoft/WSL/issues/1927

关于c - 为什么 fcntl() 不阻塞 WSL 中的 F_SETLKW?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59243106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com