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

C语言中write函数无法写入文件(errno 9 EBADF)问题咨询

write系统调用返回EBADF错误的解决方案

错误原因

你代码中的open系统调用参数配置不符合要求:

  • Linux平台的open调用必须显式指定访问模式标识(O_RDONLY只读、O_WRONLY只写、O_RDWR读写三者必须选一个)
  • 你当前仅传入了O_CREAT标识,仅声明「文件不存在则创建」,没有给返回的文件描述符授予写权限,所以后续调用write操作该文件描述符时,就会触发错误码9的EBADF(无效文件描述符)错误
  • 文件描述符1是标准输出,进程启动时默认打开且具备写权限,所以替换后可以正常输出内容

修正方案

修改open调用的第二个参数,补充访问模式标识,根据写文件的常规需求,额外补充两个常用标识:

  • 新增O_WRONLY:给文件描述符授予只写权限
  • 新增O_TRUNC:如果目标文件已存在,先清空原有内容(如果需要追加内容可以替换为O_APPEND)

另外建议补充<unistd.h>头文件,write和close系统调用的声明在该头文件中,避免部分编译器抛出隐式声明的警告。

修正后完整代码

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h> // 补充write/close所需头文件

int main (void)
{
    int     fdOut;
    char    *outFileName = "out";
    char    sample[7] ="sample\0";
    
    // 补充O_WRONLY和O_TRUNC标识
    fdOut = open (outFileName, O_CREAT | O_WRONLY | O_TRUNC, 0777);
    if (fdOut == -1)
        printf ("ups, errno %d\n", errno);
    else
    {
            write (fdOut, sample, 7);
            write (fdOut, "\n", 1);
    }
    close (fdOut);
    printf ("%s", sample);
    return (0);
}

修正后重新编译运行,会在当前工作目录生成名为out的文件,写入内容与预期一致,不会再触发EBADF错误。

内容的提问来源于stack exchange,提问作者akaCroc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:54:02