AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1069368
Accepted
Julia Fischer
Julia Fischer
Asked: 2021-07-13 05:56:54 +0800 CST2021-07-13 05:56:54 +0800 CST 2021-07-13 05:56:54 +0800 CST

使用 NFSv4 失败的群

  • 772

我不知道为什么这段代码不能在 NFS4 下运行,使用 NFS3 可以完美运行。这个想法是避免在进程仍在读取文件时写入文件。

我想调试,但我们的系统管理员无法调试。这可能是原因。在我们的 NFS4 安装下,我总是会遇到这种情况

  if ( flock(fp,LOCK_EX) == -1)
    printf("Error: file %s is already locked\n", fileName);

整个程序是:

#include <sys/file.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv){

    if (argc<2){
        printf("Usage:\n a.out fileName\n");
        return 1;
    }

    char *fileName=argv[1];
    int  fp;
     
    /* block the file, I know a process can write 
    rendering my information useless*/
    fp=open(fileName,O_RDONLY);

    if ( flock(fp,LOCK_EX) == -1){
        printf("Error: file %s is already locked\n", fileName);
    }
    else{
        printf("OK: file %s was locked\n",fileName );
    }

    /* read and parse the fileName 
       another process should not be able to write or
       modify the fileName while I am reading it
    */
    return 0;    
}

编辑:我想澄清一下。这是我正在使用的代码片段。fileName 应该是一个有效的现有文件

我正在阅读文件名并制作副本,编辑一些部分。我知道,当我这样做时,外部进程可以更新文件名。我想使用信号量来避免修改这个文件,直到我完成它。该程序运行良好,直到停止这样做。唯一的区别是文件名所在的文件系统。它从 NFS3 更新到 NFS4。甚至操作系统 (SLE15.2) 与内核 5.3.18 相同,并且使用 strerror(errno) 在 NFS4 上产生 seg 错误。我做 print("%d",error) 时的唯一提示是 9 应该是“错误的文件描述符”

谢谢你的帮助

朱莉娅

nfs nfs4
  • 3 3 个回答
  • 446 Views

3 个回答

  • Voted
  1. Matthew Ife
    2021-07-13T06:14:30+08:002021-07-13T06:14:30+08:00

    这部分代码:

    if ( flock(fp,LOCK_EX) == -1){
        printf("Error: file %s is already locked\n", fileName);
    }
    else{
        printf("OK: file %s was locked\n",fileName );
    }
    

    真的只能告诉你锁失败或成功,而不是为什么。您应该更改它以报告errno失败的原因,因为它可能表明您的锁定存在更基本的问题 - 例如尝试打开您无权访问或不存在的文件。

    if ( flock(fp,LOCK_EX) == -1){
        printf("Error: file %s is already locked: %s\n", fileName, strerror(errno));
    }
    else{
        printf("OK: file %s was locked\n",fileName );
    }
    

    您可能还希望包含errno.h在包含列表中,以确保您找到正确的变量。

    • 0
  2. Best Answer
    Martin
    2021-07-13T06:32:28+08:002021-07-13T06:32:28+08:00

    我刚刚检查了flock的联机帮助页,在NOTES部分是重要的部分:

    NFS details
       In Linux kernels up to 2.6.11, flock() does not lock files over NFS (i.e., the scope of locks was limited to the local system).  Instead, one could use fcntl(2) byte-range locking, which does
       work over NFS, given a sufficiently recent version of Linux and a server which supports locking.
    
       Since Linux 2.6.12, NFS clients support flock() locks by emulating them as fcntl(2) byte-range locks on the entire file.  This means that fcntl(2) and  flock()  locks  do  interact  with  one
       another over NFS.  It also means that in order to place an exclusive lock, the file must be opened for writing.
    
       Since  Linux  2.6.37,  the  kernel  supports  a compatibility mode that allows flock() locks (and also fcntl(2) byte region locks) to be treated as local; see the discussion of the local_lock
       option in nfs(5).
    

    您只是打开文件进行读取,这就是群调用失败的原因。

    • 0
  3. kofemann
    2021-07-13T13:43:11+08:002021-07-13T13:43:11+08:00

    NFS v3 在协议级别没有锁定支持。该功能由附加的(nfs 协议外部的)锁管理器提供。另一方面,NFS v4 将锁定作为规范的一部分。此外,有两种类型的锁。一是字节范围锁,二是访问共享。尽管后一种是您正在寻找的,但 POSIX API 没有公开它,因此不适用于 linux 和 unix。

    要使锁定与 nfs v4 和 v3 一起使用,您需要使用可用作fcntl或lockf函数的字节范围锁定。

    检查 nfs 开发人员(包括我自己)使用的锁定测试代码,以验证独立于协议版本的客户端/服务器行为。

    http://git.linux-nfs.org/?p=steved/cthon04.git;a=blob;f=lock/tlock.c;h=8c837a87976d17c58a25c9bd08d9f935e4521402;hb=HEAD#l835

    • 0

相关问题

  • 在 NFS 文件服务器上获取不规则时间戳

  • 过时的 NFS 句柄

  • sh 脚本:如果未安装远程文件系统,如何安装它?

  • 分析 Linux NFS 服务器性能

  • NFS 缓存导致间歇性滞后

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve