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
相关产品推荐
相关产品推荐

