【发布时间】: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 <sys/file.h> 之外没有提及任何内容。
我需要指定哪些编译器标志才能让使用 flock() 的程序在 Solaris 5.10 上运行?
【问题讨论】:
-
在
truss或sotruss实用程序下运行使用“flock()”的应用程序,以查看它实际执行哪些库和系统调用来锁定它访问的文件。你显然只有关于它在做什么来锁定文件的二进制和轶事故事,但如果你想与它进行互操作,你需要真正知道它在做什么。 -
@AndrewHenle,谢谢你的建议,确实如此,我应该花一些时间来分析二进制而不是盲目地编写代码。系统调用跟踪听起来是一个好的开始!
标签: c gcc compiler-errors solaris flock