可能导致Linux open调用返回EINVAL的原因

4

我正在尝试在我的源代码中进行系统调用,代码如下。

int file;
file = open(argv[index], O_RDONLY);

当命令行参数是指向文件系统中的二进制文件路径时,我调用此命令会出现 EINVAL 错误。我已确认该文件存在并且具有访问权限。

您有什么建议在什么情况下会抛出 EINVAL 错误。


你是按照这个方式调用它的吗?你尝试过不同的文件吗?有没有警告(使用“-Wall”)? - Piotr Praszmo
谢谢Banthar。是的,我尝试打开不同的文件。这个错误只出现在某些二进制文件中。我应该再检查一下警告。 - Vivek Maran
这个文件只是一个普通的二进制文件,不是套接字或设备吗?它在哪种文件系统上?实际上,标志中只有 O_RDONLY 吗? - Random832
是的,它是一个普通的二进制文件。它位于扩展文件系统上。它只有O_RDONLY标志。 - Vivek Maran
我在想,您输入名称时是否做了一些奇怪的事情? - asveikau
ext2?ext3?ext4?内核版本? - Samuel Edwin Ward
3个回答

3
官方文档建议,这是因为您的open()实现不支持您尝试打开的文件的同步IO。

1
这是正确的答案。具体而言,用户的open()调用所使用的底层内核驱动程序并未实现fsync()。 - Syrinx

2
故障原因:
有两个进程(process-1和process-2)正在紧密地执行并尝试打开此二进制文件。由于我的系统(嵌入式设备)在此打开调用之后会崩溃,分裂出的调试信息不正常,这让我怀疑process-1。但真正的罪魁祸首是process-2,他正在使用O_RDWR标志打开二进制文件。但是我的文件系统(网络挂载)被挂载为“只读文件系统”。
需要注意的事项:
通过改进perror打印输出,应该可以发现问题的真正原因是“只读文件系统”。所以,我最初perror的描述必须是先前错误调用的未清除值。这里的教训是要谨慎使用perror,以避免分析误导性的错误消息。
可能引发EINVAL错误的情况:
如果我们使用与文件不符合的O_SYNC(或相关)标志,打开调用将显示EINVAL。我根据Rafe先前提到的文档得出这个结论。

1
如果您确定argv[index]实际包含文件名,并且O_RDONLY没有被覆盖(O_RDONLY应该等于0),请通过dmesg命令检查系统日志,确保内核中没有发生任何奇怪的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接