linux open call返回EINVAL的可能原因

linux open call返回EINVAL的可能原因,c,linux,C,Linux,我试图在我的源代码中进行系统调用,如下所示 int file; file = open(argv[index], O_RDONLY); 其中,命令行参数是指向文件系统中二进制文件的路径。但是这个电话给我抛出了一个EINVAL错误。我已检查文件是否存在以及访问该文件所需的权限 任何关于EINVAL错误将被抛出的情况的建议。官方文档表明,这是因为open()的实现不支持尝试打开的文件的同步IO。如果您确定argv[index]实际上包含文件名,并且O_RDONLY没有被覆盖(O_RDONLY应该等

我试图在我的源代码中进行系统调用,如下所示

int file;
file = open(argv[index], O_RDONLY);
其中,命令行参数是指向文件系统中二进制文件的路径。但是这个电话给我抛出了一个
EINVAL
错误。我已检查文件是否存在以及访问该文件所需的权限


任何关于
EINVAL
错误将被抛出的情况的建议。

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

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

故障原因:

有两个进程(进程1和进程2)在close sequel中执行,并试图打开这个二进制文件。由于我的系统(嵌入式设备)将在这个打开的调用后崩溃,因此分离出来的调试不正确,这使我怀疑进程1。但真正的罪魁祸首是process-2,他使用
O_RDWR
标志打开二进制文件。但是我的文件系统(网络挂载)被挂载为“只读文件系统”

需要注意的要点:

优化perror打印它应该是问题的正确原因,因为“只读文件系统”。因此,我的初始描述必须是以前任何错误调用的未清除值。这里学习的一点是小心使用perror,以避免分析误导性错误消息

可能的情况将抛出
EINVAL
错误


如果我们对不应该使用的文件使用O_SYNC(或)相关标志,则open调用将显示
EINVAL
。我根据Rafe之前提到的文档得出结论。

这正是您所说的吗?你试过不同的文件吗?是否有任何警告(带有
-Wall
)?谢谢Banthar。。是的,我试过打开不同的文件。只有某些二进制文件出现此错误。我应该仔细检查警告。该文件只是一个普通的二进制文件,而不是套接字或设备吗?它在什么类型的文件系统上?它实际上只是标志中的O_RDONLY吗?是的,它是一个普通的二进制文件。它位于扩展文件系统上。它只有O_RDONLY标志。我想知道你在输入名字时是否做了一些奇怪的事情?这是正确的答案。具体来说,user open()调用使用的底层内核驱动程序没有实现fsync()。