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 / 问题 / 50836
Accepted
Alex Reynolds
Alex Reynolds
Asked: 2009-08-07 02:09:43 +0800 CST2009-08-07 02:09:43 +0800 CST 2009-08-07 02:09:43 +0800 CST

fopen() 无法在 /tmp 共享上打开文件

  • 772

我有一个 C 应用程序,有时无法打开存储在/tmp共享中的文件。

这是相关的代码块:

  // open file and start parsing

  notStdin = strcmp(inFile, "-");
  if (notStdin) {
     coordsIn = fopen(inFile, "r");   <----- inFile = file that I want to open
     if (coordsIn == NULL) {
        fprintf(stderr, "ERROR: Could not open coordinates file: %s\n\t%s\n", inFile, strerror(errno));
        exit(EXIT_FAILURE);
     }
  }
  else
     coordsIn = stdin;

在八到十次试验中,我得到一个NULLFILE 指针。这是一个示例错误消息:

ERROR: Could not open coordinates file: /tmp/coordinates.txt
       File or directory does not exist

但是,该文件/tmp/coordinates.txt确实存在,因为我可以使用标准实用程序(如head、cat或more等)打开它。

/tmp/coordinates.txt不同试用文件的权限是一样的。

以下是结果uname -a:

$ uname -a
Linux hostname 2.6.18-128.2.1.el5 #1 SMP Wed Jul 8 11:54:47 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

如果我使用inFile存储在不同的非/tmp共享中的不同,那么我不会观察到这种症状。

是否有任何事情会导致fopen()存储在/tmp共享中的文件失败?我可以采取其他故障排除步骤吗?

linux tmp fopen
  • 5 5 个回答
  • 5977 Views

5 个回答

  • Voted
  1. Best Answer
    Kyle Brandt
    2009-08-07T02:32:30+08:002009-08-07T02:32:30+08:00

    打开的文件太多?
    您的程序是否打开大量文件?也许您的文件描述符用完了?如果是这种情况,这里是关于如何更改程序、shell 和操作系统的链接。要查看您正在使用您的程序的许多人:

    sudo lsof | grep <PID> | wc -l
    

    在我的 Ubuntu 系统上,shell 限制为 1024,包括 stdout、stderr 和 stdin。这是在 /etc/security/limits.conf 中设置的。下面的小程序显示了这一点:

    #include <stdio.h>
    
    int count=0;
    
    int main( void ) {
        while(1) {
            FILE *fd = fopen("foo", "r");
            if ( fd == NULL) {
                printf("%i\n", count);
                return(1);
            }
            count++;
        }
        return(0);
    }
    

    当我运行它时,它会打印退出状态为 1 的“1021”。

    检查系统错误:
    更一般地说,您可以随时检查 dmesg 或 /var/log/messages 的输出是否有任何错误。

    观察文件,看看是否有其他东西弄乱了它:
    也许文件不存在,有什么东西正在从你下面删除它?您可能希望使用 inotify 来查看文件上的所有事件,或者使用 intify 的工具,例如incron或inotify-tools。

    • 5
  2. lexsys
    2009-08-07T03:21:02+08:002009-08-07T03:21:02+08:00

    也许某个程序正在锁定这个文件?它可以是您的程序的另一个副本。

    有什么lsof /tmp/coordinates.txt表现吗?

    • 0
  3. Kjetil Joergensen
    2009-08-07T05:10:47+08:002009-08-07T05:10:47+08:00

    我想不出 /tmp 有什么特别的地方应该使文件间歇性地不存在。/tmp 只是一个普通目录,具有稍微特殊的权限,允许每个人乱搞,但限制非 root 用户不拥有文件以删除它们。

    您的程序是否有任何外部修改/更改该文件,或者您的程序是否是多线程的并使用该文件?如果是这样,它可能是一个竞争条件。

    要检查是否是这种情况,您可以按照 Kyle 的建议使用 inotify (您可能在删除并从事件中移动之后)来查看文件到底发生了什么。

    或者,您可以尝试统计文件并查看它的 ctime 和/或 mtimes 是否与 fopen 因 ENOENT 失败时一致。

    • 0
  4. bjarkef
    2009-08-07T06:08:25+08:002009-08-07T06:08:25+08:00

    维姆?

    只是一个疯狂的猜测。发生此问题时,您是否在 vim 中打开了 /tmp/coordinates.txt 文件?

    我在 vim 中编辑的文件从文件系统中消失并在不久后重新出现时遇到了问题。我实际上从未见过 ls 丢失的文件,但我有例如 gcc 在尝试打开文件时失败,只是在第二次尝试中成功。

    这不是一个非常罕见的神器,它在白天经常发生。

    • 0
  5. user47918
    2010-07-09T13:17:26+08:002010-07-09T13:17:26+08:00

    我不知道解决方案是什么,但我知道我观察到了同样的问题,而不仅仅是在 /tmp 上。它可能发生在 NFS 挂载上,甚至本地挂载上,例如 /lib。我今天发现的一个问题通过(不正确地)打开、查找、读取一点并关闭同一个文件数千次(而不是仅在整个操作中保持文件打开)来重现此问题。偶尔,fopen() 之一会因 ENOENT 错误而失败。这并没有像一个人建议的那样打开太多文件——它实际上认为文件一瞬间不存在。

    我一直在寻找其他人是否有类似的问题,这是我最接近的。不过,我没有任何答案,只是在寻找解决方案。

    我不认为这是 Linux(或 RHEL)特有的,因为我没有在任何地方看到这种情况,只是在一个环境中。我不知道可能导致此问题的环境有什么不同(存在差异)。虽然看到它在 RHEL5 中没有得到修复并不好(我在 RHEL4 上看到它)。

    • 0

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

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

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

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

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

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

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +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