You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:06:02