C语言调用open二次以只读模式打开文件返回fd=-1是什么原因?
问题根因
核心错误出在第一次调用open创建文件的逻辑:
- 当
open携带O_CREAT标志位时,必须传入第三个参数指定新文件的访问权限,这是POSIX标准要求的语法规则。你当前的代码省略了该参数,系统会读取栈上的随机值作为权限位,生成的文件大概率没有可读权限,因此第二次以只读模式打开时会被系统权限拦截,返回-1。 - 你可以在两次
open返回-1的分支中添加perror("open错误");,即可看到明确的错误提示为Permission denied(权限不足)。
修复方案
修改第一次open的调用语句,补充权限参数即可:
// 0644 代表文件所有者拥有读写权限,同组用户、其他用户拥有读权限 fd = open("Test01.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);
修改后生成的文件自带读权限,第二次只读打开就能正常获取文件描述符。
额外优化建议
- 第一次
open成功后执行的lseek(fd, 0, SEEK_SET);是无效操作,马上要关闭文件的场景下调整文件偏移没有实际意义,可以直接删除。 write(fd, str, sizeof(str));会写入完整的50字节,包含字符串末尾未使用的垃圾数据,建议改为write(fd, str, i);,仅写入用户实际输入的字符长度。
内容的提问来源于stack exchange,提问作者AwkNinja
相关产品推荐
相关产品推荐

