linux打开调用返回EINVAL的可能原因

时间:2012-06-15 16:54:12

标签: c linux

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

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

命令行争论是我文件系统中二进制文件的路径。但是这个电话会引发EINVAL错误。我已经检查了文件是否存在以及访问它所需的权限。

有关EINVAL错误将被抛弃的具体情况的任何建议。

3 个答案:

答案 0 :(得分:2)

失败原因:

有两个进程说(进程1和进程-2)正在执行紧密续集并试图打开这个二进制文件。由于我的系统(嵌入式设备)在这次打开调用后会崩溃,因此分离出的调试不正确,这让我怀疑进程1。但实际的罪魁祸首是进程2谁用O_RDWR标志打开二进制文件。但我的文件系统(网络安装)被安装为“只读文件系统”。

需要注意的要点:

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

EINVAL错误将被抛弃的可能情况

如果我们对不应该使用的文件使用O_SYNC(或)相关标志,则打开调用将显示EINVAL。我的结论基于Rafe先前提到的文档。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果您确定argv[index]实际上包含文件名且O_RDONLY未被某种方式覆盖(O_RDONLY应该等于0),请通过{{1}检查您的系统日志命令并确保在内核中没有发生任何时髦。