【问题标题】:Using flock() on Solaris 5.10在 Solaris 5.10 上使用 flock()
【发布时间】:2020-03-20 19:54:40
【问题描述】:

我正在为 Solaris 5.10 编写一个使用 flock() 进行文件同步的 C 实用程序。我的目标是与现有的遗留系统进行互操作,该遗留系统也在后台调用flock()。根据我盒子上的手册页,它在 BSD 兼容模式下受支持——毕竟,遗留系统是通过某种方式编译的! (不幸的是,我现在只能访问二进制文件。)

问题是,当我尝试编译我的代码时,它失败并出现以下错误:

main.c: In function `main':
main.c:11: warning: implicit declaration of function `flock'
main.c:11: error: `LOCK_EX' undeclared (first use in this function)
main.c:11: error: (Each undeclared identifier is reported only once
main.c:11: error: for each function it appears in.)
main.c:11: error: `LOCK_NB' undeclared (first use in this function)

这是一个简短的可重现示例(如果您手头有 5.10,则可以重现......):

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <fcntl.h>
#include <stdio.h>

int main(int argc, char** argv) {
  int fd;
  if ((fd = open("file.txt", O_CREAT | O_RDWR, 0644) == -1))
    return 1;
  if (flock(fd, LOCK_EX | LOCK_NB) == -1)
    return 1;

  puts("File locked!");
  return 0;
}

我正在使用带有以下参数的 gcc 3.4.3:-o test -std=gnu99 -Wall main.c。错误消息似乎表明我包含了错误的头文件,但flock() 的手册页除了标准的#include &lt;sys/file.h&gt; 之外没有提及任何内容。

我需要指定哪些编译器标志才能让使用 flock() 的程序在 Solaris 5.10 上运行?

【问题讨论】:

  • trusssotruss 实用程序下运行使用“flock()”的应用程序,以查看它实际执行哪些库和系统调用来锁定它访问的文件。你显然只有关于它在做什么来锁定文件的二进制和轶事故事,但如果你想与它进行互操作,你需要真正知道它在做什么。
  • @AndrewHenle,谢谢你的建议,确实如此,我应该花一些时间来分析二进制而不是盲目地编写代码。系统调用跟踪听起来是一个好的开始!

标签: c gcc compiler-errors solaris flock


【解决方案1】:

flock() 相当旧,Solaris 系统不支持,您必须选择其他替代系统调用,例如fcntl(),如here 中所述

手册页说:这些接口的使用应该仅限于在 BSD 平台上编写的应用程序。不支持将这些接口与任何系统库或多线程应用程序一起使用。

【讨论】:

  • 嗯,谢谢你的链接,如果我找不到获得flock() 支持的合理方法,我会尝试将我的代码转换为fcntl()。我应该注意的一件事,我可能没有在我的问题中说清楚,flock() 似乎在我的 Solaris 机器上受支持(5.10 已经很老了)。问题只是让它发挥作用!
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多