我正在尝试在我的源代码中进行系统调用,如下所示。
int file;
file = open(argv[index], O_RDONLY);
命令行参数是我的文件系统中二进制文件的路径。但是这个电话给我一个EINVAL
错误。我已经检查了文件的存在以及访问它所需的权限。
关于什么情况下EINVAL
会抛出错误的任何建议。
官方文档表明这是因为您的实现open()
不支持您尝试打开的文件的同步 IO。
失败原因:
有两个进程(进程 1 和进程 2)正在执行,并试图打开这个二进制文件。由于我的系统(嵌入式设备)在此打开调用后会崩溃,因此拆分出来的调试不正确,这让我怀疑 process-1。但真正的罪魁祸首是使用O_RDWR
标志打开二进制文件的 process-2。但是我的文件系统(网络挂载)被挂载为“只读文件系统”。
需要注意的点:
改进 perror打印它应该是问题的正确原因为“只读文件系统”。所以我最初的错误描述必须是之前任何错误调用的未清除值。这里的一项学习是谨慎使用perror,以避免分析误导性错误消息。
可能EINVAL
会抛出错误的情况:
EINVAL
如果我们对不应该使用的文件使用 O_SYNC(或)相关标志,则打开调用将显示。我根据 Rafe 之前提到的文档得出结论。
如果您确定它argv[index]
实际上包含文件名并且O_RDONLY
没有以某种方式被覆盖(O_RDONLY
应该等于 0),请通过dmesg
命令检查您的系统日志并确保内核中没有发生任何奇怪的事情。