朋友们、伙计们,我们又见面了,本期来给大家带来关于重定向和缓冲区的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!
C 语 言 专 栏:C语言:从入门到精通
数据结构专栏:数据结构
个 人 主 页 :stackY、
C + + 专 栏 :C++
Linux 专 栏 :Linux

目录
1. 重定向
重定向这个概念在前面Linux常见指令章节就介绍过它的指令以及用法,那么本节来一起深入了解一下重定向:
1.1 输出重定向
echo 字符串 > 文件 :将本来输出在显示器文件(标准输出)上的字符串输出至指定的文件。
标准输出对应的文件fd是1。
下面用代码来实现一下重定向的功能:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #define FILE_NAME "log.txt" int main() { // 关闭标准输出 close(1); int fd = open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0666); printf("fd: %d\n", fd); fprintf(stdout, "stdout->fd: %d\n", stdout->_fileno); // 刷新 fflush(stdout); close(fd); }先看结果,再分析代码:
我们都知道文件fd的分配规则,是寻找最小的未被使用的fd进行分配,所以我们先把1号文件描述符关闭,然后再打开文件时,1号文件描述符就被新打开的文件分配走了,这些C语言打印函数,默认是往1号文件描述符对应的文件中打印,简单的说就是它们只认识1这个数字,并不会在乎这个文件到底是不是显示器文件,所以才会把数据打印到新打开的文件中。
至于这里为什么要加这个fflush用来刷新缓冲区在后续会详细介绍。
1.2 追加重定向
追加重定向直接把打开文件时的方式从清空改为追加即可:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #define FILE_NAME "log.txt" int main() { // 关闭标准输出 close(1); //int fd = open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0666); int fd = open(FILE_NAME, O_WRONLY | O_CREAT | O_APPEND, 0666); printf("fd: %d\n", fd); fprintf(stdout, "stdout->fd: %d\n", stdout->_fileno); // 刷新 fflush(stdout); close(fd); }
1.3 输入重定向
cat指令默认是从标准输入键盘文件中读取数据;
cat < 文件:本来从键盘读取数据,但是重定向为从指定的文件读取数据。




最低0.47元/天 解锁文章
1523

被折叠的 条评论
为什么被折叠?



