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

为何不能用stdout替代1作为write系统调用的第一个参数?

为什么不能用stdout代替1作为write系统调用的第一个参数?

嘿,这个问题的核心在于你搞混了两个完全不同的概念:文件描述符(file descriptor)和C标准库的文件流指针(FILE*),咱们一步步拆解来看:

1. 先搞懂write()系统调用需要什么

write()是Linux/Unix下的底层系统调用,定义在<unistd.h>里,它的函数原型是:

ssize_t write(int fd, const void *buf, size_t count);

这里第一个参数fd要求的是整数类型的文件描述符——这是内核用来标识打开文件的索引值,标准输出对应的文件描述符确实是1(标准输入是0,标准错误是2)。

2. 那stdout到底是什么?

stdout是定义在<stdio.h>里的一个指向FILE结构体的指针(也就是FILE*类型),它是C标准库为了简化I/O操作封装出来的对象。这个结构体内部不仅包含了对应的文件描述符,还维护了缓冲区、读写位置等额外信息,像printf()、fputs()这些C标准库的I/O函数,都是基于FILE*来工作的。

你直接把stdout传给write(),就相当于把一个内存地址(指针的值)当成整数文件描述符来用,类型完全不匹配——编译器会直接报错,就算你强制转换类型,这个地址值也绝对不是1,自然没法正确输出到标准输出。

3. 正确的做法:用fileno()转换

如果你想通过stdout来获取对应的文件描述符传给write(),可以用C标准库提供的fileno()函数,它的作用就是把FILE*转换成对应的整数文件描述符:

#include <unistd.h>
#include <stdio.h>

int main(void) {
    write(fileno(stdout), "This will be output to standard out\n", 36);
    return 0;
}

fileno(stdout)会返回当前stdout对应的文件描述符(通常是1,但如果stdout被重定向,这个值可能会变化),这样就能正确调用write()输出内容了。

总结

别把底层系统调用的文件描述符(整数)和C标准库的文件流指针(FILE*)搞混,它们是完全不同的东西,不能直接替换使用。

内容的提问来源于stack exchange,提问作者Vegan - save animal's life

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:52:29