行缓冲

本文通过四个示例程序详细解析了C语言中标准输出的缓冲机制。包括如何使用printf进行行缓冲输出,sleep函数对输出的影响,以及fflush函数的作用等。

观察下面四种场景,看会出现什么现象?
1.

#include<stdio.h>
int main()
{
 printf("hello 行缓冲\n");
 return 0;
}

运行结果:
这里写图片描述
ps:字符串”hello 行缓冲”被放到缓冲区之后,遇到换行符”\n”,此内容就会被刷新(即就是此字符串会被显示到屏幕上)
2.

#include<stdio.h>
int main()
{
 printf("hello 行缓冲\n");
 sleep(5);
 return 0;
}

运行结果:

这里写图片描述
字符串”hello 行缓冲”被放到缓冲区中后,遇到”\n”就会刷新缓冲区(即就是把缓冲区中的内容显示到屏幕上),再接着执行sleep函数,所以sleep函数对printf的输出不会产生影响

3.

#include<stdio.h>
int main()
{
 printf("hello 行缓冲");
 sleep(5);
 return 0;
}

ps:字符串”hello 行缓冲”被放到缓冲区中后,再接着执行sleep函数,5秒过后,程序return退出,在程序退出前会刷新缓冲区,此字符串此时才会被显示到屏幕上
运行结果:
这里写图片描述
4.

#include<stdio.h>
int main()
{
 printf("hello 行缓冲");
 fflush(stdout);
 sleep(5);
 return 0;
}

运行结果:
这里写图片描述
ps:字符串”hello 行缓冲”被放到缓冲区中后,接着执行fflush函数,此函数的作用是刷新缓冲区,虽然没有换行符,但是缓冲区中的内容也被显示到屏幕上了,再接着执行sleep函数,5秒过后,程序正常退出

### 原理 `popen` 函数在 C 语言中用于创建一个管道,并调用一个 shell 命令。缓冲是标准 I/O 库提供的一种缓冲机制,对于缓冲,数据会在遇到换符(`\n`)时被刷新到文件或设备中。当使用 `popen` 以读模式打开一个进程时,若该进程的输出被设置为缓冲,那么每遇到一个换符,`popen` 所关联的流就会接收到一批数据;以写模式打开时,向该流写入的数据在遇到换符时会被发送给子进程。 ### 使用方法 以下是一个简单的示例代码,展示了 `popen` 函数缓冲的使用: ```c #include <stdio.h> #include <stdlib.h> int main() { FILE *fp; char buffer[1024]; // 以读模式打开一个进程 fp = popen("ls -l", "r"); if (fp == NULL) { perror("popen"); return EXIT_FAILURE; } // 读取进程的输出 while (fgets(buffer, sizeof(buffer), fp) != NULL) { printf("%s", buffer); } // 关闭管道 pclose(fp); return EXIT_SUCCESS; } ``` 在上述代码中,`popen("ls -l", "r")` 以读模式打开一个执 `ls -l` 命令的子进程。`fgets` 函数从 `popen` 返回的流中读取数据,每次遇到换符时,`fgets` 就会返回,将一数据存储在 `buffer` 中。 ### 注意事项 - **缓冲区大小**:要确保用于存储读取数据的缓冲区足够大,以避免数据截断。若输出可能很长,应适当增大缓冲区大小。 - **错误处理**:`popen` 可能会因为各种原因失败,如权限问题或资源不足,因此在使用 `popen` 后需要检查其返回值是否为 `NULL`,并进相应的错误处理。 - **关闭管道**:使用完 `popen` 返回的流后,必须使用 `pclose` 函数关闭管道,以释放相关资源。若不关闭,可能会导致资源泄漏。 - **命令安全性**:若 `popen` 中使用的命令包含用户输入,要特别注意防止命令注入攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值