Linux04(重定向)

#技术笔记

1.程序在开启的时候,系统就会直接打开三个文件描述符,分别是0,1,2,对应三个文件流 stdin,stdout, stdeff。

  1. 使用 fopen 的时候,打开一个文件,有用到缓冲区(默认全缓冲), 底层是使用到了文件描述符的;提供一个系统调用 fileno() 这个可以把FILE * 转换成文件描述符。

  2. printf() 只往文件描述符 1 的那去。由于文件描述符是从小到大分配,关了1又分配给了后面打开的了。代码如下:

    int main(int argc, char *argv[])
    {
    printf("11111\n");
    close(1);

    复制代码
     int fd = open("1.txt", O_WRONLY | O_CREAT|O_TRUNC, 0666);
    
     printf("fd = %d\n", fd);
     write(fd, "66666\n", 6);
     
     close(fd);
    
     return 0;

    }

运行结果:

4.dup() 和 dup2()

dup 函数的功能是创建一个新的文件描述符(系统自动选最小可用),然后指向与参数里面相同的文件对象;dup2 函数分两 个参数,第一个是旧的文件描述符,可以用来指向旧的对象,第二个参数是指定拿一个你想要的文件描述符0,1,2都可以,后续在屏幕和文件"反复横跳" 都可以使用这2个函数和 文件描述符1 进行操作一下就行。(注意它们虽然都返回int,但不要用整形去赋值)

5.进行重定向的时候一定先 printf("\n"); 一把 \n换行是关键!printf 的缓冲模式不是系统默认全缓冲,而是:输出到终端 → 行缓冲,输出到文件/管道 → 全缓冲。

相关推荐
万年咸鱼28 分钟前
解决C语言的内存释放机制
java·c语言·python
顺风尿一寸29 分钟前
手写迷你 Docker:用 Namespace + Cgroup v2 实现一个简单容器
linux
一木 之林44 分钟前
DeepSeek Agent 开发(三)
java·大数据·linux
老王爱玩车2 小时前
自定义类型:结构体
c语言·开发语言·学习
大猫会长2 小时前
调用codebuddy集成的supabase授权白屏解决方法
linux·运维·服务器
羔羊++2 小时前
29_实验二十八_buildroot配置与编译
linux
夜之眷属2 小时前
服务器被挖矿病毒入侵的排查与清理实录
运维·服务器
LoneEon2 小时前
CentOS7 部署 Nacos3.x 集群实战:从注册中心到 AI 管理中心
linux·人工智能·nacos
传人3 小时前
为什么 Xshell 中可以通过java -version查询到java 版本号码,Electerm 却查不到?
java·linux·服务器
陌上花开缓缓归以3 小时前
mebdlts3.4.1安全启动全流程
服务器·算法