Linux —— 基础I/O(二)

目录

一,FILE

二,缓冲区

三,重定向

系统调用dup2 


一,FILE

  • FILE结构体内部包括
    • 变量_fileno,即对应的文件描述符下标fd
    • 应用层C语言提供的缓冲区数据
  • 其IO相关函数与系统调用接口对应,封装了系统调用接口,本质上是通过fd访问;
  • 向普通文件写入是全缓冲,向屏幕文件写入是行缓冲;

//语言层次上
int main()    
{    printf("stdin fd=%d\n",stdin->_fileno);    printf("stdout fd=%d\n",stdout->_fileno);    printf("stderr fd=%d\n",stderr->_fileno);                                        FILE* fp = fopen("log.txt", "r");    printf("log.txt fd=%d\n",fp->_fileno);    pclose(fp);    return 0;    
} 
[wz@192 Desktop]$ ./target 
stdin fd=0
stdout fd=1
stderr fd=2
log.txt fd=3

//路径/usr/include/stdio.htypedef struct _IO_FILE FILE;  
//路径/usr/include/libio.h
struct _IO_FILE {int _flags;   /* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags/* The following pointers correspond to the C++ streambuf protocol. *//* Note:  Tk uses the _IO_read_ptr and _IO_read_end fields directly. */char* _IO_read_ptr; /* Current read pointer */char* _IO_read_end; /* End of get area. */char* _IO_read_base;  /* Start of putback+get area. */char* _IO_write_base; /* Start of put area. */char* _IO_write_ptr;  /* Current put pointer. */char* _IO_write_end;  /* End of put area. */char* _IO_buf_base; /* Start of reserve area. */char* _IO_buf_end;  /* End of reserve area. *//* The following fields are used to support backing up and undo. */char *_IO_save_base; /* Pointer to start of non-current get area. */char *_IO_backup_base;  /* Pointer to first valid character of backup area */char *_IO_save_end; /* Pointer to end of non-current get area. */struct _IO_marker *_markers;struct _IO_FILE *_chain;int _fileno;
#if 0int _blksize;
#elseint _flags2;
#endif_IO_off_t _old_offset; /* This used to be _offset but it's too small.  */#define __HAVE_COLUMN /* temporary *//* 1+column number of pbase(); 0 is unknown. */unsigned short _cur_column;signed char _vtable_offset;char _shortbuf[1];/*  char* _save_gptr;  char* _save_egptr; */_IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};  

二,缓冲区

int main()
{//C语言printf("hello printf\n");fprintf(stdout, "hello fprintf\n");fputs("hello fputs\n", stdout);//system callconst char* msg = "hello write\n";write(1, msg, strlen(msg));fork();return 0;
}
//向屏幕刷新策略为行缓冲
[wz@192 Desktop]$ ./target 
hello printf
hello fprintf
hello fputs
hello write
//去掉\n,除了系统调用只打印一个,其他都打印两个;
[wz@192 Desktop]$ ./target 
hello writehello printfhello fprintfhello fputshello printfhello fprintfhello fputs
//输出重定向后,刷新策略改为全缓冲
//除了系统调用只打印一个,其他都打印两个;
[wz@192 Desktop]$ ./target > log.txt
[wz@192 Desktop]$ cat log.txt 
hello write
hello printf
hello fprintf
hello fputs
hello printf
hello fprintf
hello fputs
  • 库函数均刷新了两次,系统调用只刷新了一次;
  • 库函数会自带缓冲区,重定向到普通文件,刷新策略会从行缓冲改为全缓冲;没有指定刷新,就会在进程结束时统一刷新;fork时,父子数据会发生写实拷贝;
  • 系统调用没有所谓的用户级缓冲区,但OS会通过内核级的缓冲区;

三,重定向

//关闭默认打开的1指向的文件,即stdout
//此时新创建的文件,fd将会是1
//本来printf应打印到显示器,此时应该写入到log.txt
int main()    
{    close(1);    int fd = open("log.txt", O_WRONLY|O_CREAT, 0644);    printf("fd=%d\n",fd); close(fd);                                                                                     return 0;    
}   
//此时不仅没有打印到屏幕,也没有写入到log.txt
[wz@192 Desktop]$ ./target 
[wz@192 Desktop]$ cat log.txt 
[wz@192 Desktop]$ 

int main()    
{    close(1);    int fd = open("log.txt", O_WRONLY|O_CREAT, 0644);    printf("fd=%d\n",fd); fflush(stdout);close(fd);                                                                                     return 0;    
}   
//刷新到了log.txt文件
[wz@192 Desktop]$ ./target 
[wz@192 Desktop]$ cat log.txt 
log.txt fd=1

系统调用dup2 

int main()    
{    int fd = open("log.txt", O_WRONLY|O_CREAT, 0644);    if(fd<0){    perror("open");    }    dup2(fd,1);    const char* msg = "write dup2\n";                                                                                   write(1, msg, strlen(msg));close(fd);return 0;    
}  
//重定向后,向log.txt文件写入了
[wz@192 Desktop]$ ./target 
[wz@192 Desktop]$ cat log.txt 
write dup2
int main()    
{    int fd = open("log.txt", O_RDONLY);                                              if(fd<0){    perror("open");    }    dup2(fd,0);    char buf[1024];    ssize_t r_size = read(0, buf, sizeof(buf)-1);    if(r_size>0){buf[s]=0;printf("%s\n",buf);   } close(fd);    return 0;    
}  
//重定向后,从文件读取数据
[wz@192 Desktop]$ ./target 
wirte dup2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1381233.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot使用自定义事件监听器的demo

记录一下SpringBoot自定义事件监听器的使用方法 案例源码:SpringBoot使用自定义事件监听器的demo 使用的SpringBoot2.0.x版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><…

bat批处理文件 - win10桌面图标白标修复(图标变为白色方块)

前言 当你桌面应用变成如图所示白标时(正常运行)&#xff0c;那么这个批处理文件可以帮助你。 其中&#xff0c;IconCache.db就是图标缓存文件&#xff0c;把他删除重新构建即可。 一、新建文本文件.txt 复制以下代码 echo offtaskkill /f /im explorer.exeCD /d %userprof…

Win10系统任务栏图标显示白色方块的解决方法

时间&#xff1a;2022-07-30 问题&#xff1a;Win10系统任务栏图标显示白色方块 解决后&#xff1a; 原因&#xff1a;Windows对于图标的缓存 解决方法&#xff1a; 1.进入C盘的用户家目录下的AppData目录&#xff0c;再进入Local目录 1.1 WinR 然后运行 %localappdata% 直…

计算机桌面有去不掉的框,电脑右下角有个白色方框去不掉

电脑右下角出现了一个白色方框&#xff0c;一直去不掉&#xff1f;学习有不少用户遇到这种桌面出现白框的情况&#xff0c;在电脑桌面上非常影响正常使用。那么我们今天就一起来学习下如何去掉电脑右下角的白色方框吧。 首先&#xff0c;实用组合键“ctrlshiftEsc”唤出任务管理…

怎么解决win10电脑桌面图标右下角有黑色方块的问题!轻松修复桌面图标显示异常!【解决方案分享】

标题电脑桌面的快捷图标左下角有黑色方块 1、今天突然发现电脑桌面的快捷图标左下角有黑色方块&#xff0c;显得很难看&#xff0c;又无从下手&#xff0c;直接上图看。 2、网上找了很多方法说是 “这是缓存出错引起的&#xff0c;用下面的软件修复一下&#xff08;下载360卫…

桌面图标变白色方块,如何解决

1、桌面图标变成白色方块&#xff08;由于我的图标已修复&#xff0c;该图片为网图&#xff09; 2、桌面右击&#xff0c;在桌面新建一个文本文档&#xff0c;命名为 图标修复.bat 3、右击图片修复文本文档&#xff0c;点击编辑&#xff0c;输入一下代码并保存 代码&#xff1a…

【雕爷学编程】Arduino动手做(201)---行空板开发环境之VSCode

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

个人空间岁末大回报活动12月26日获奖名单

个人空间岁末大回报: 动手就有C币拿!活动已于15日启动,非常感谢各位网友的大力支持和积极参与,个人空间的所有工作人员在这祝大家好运,希望你们每天都能拿到C币存入社区银行! 欢迎各位获奖者去自己的银行查看金额是否到账,如果有任何疑问都可以用【留言】【私信】等各种…

个人空间岁末大回报活动12月16日获奖名单

个人空间岁末大回报: 动手就有C币拿!活动已于15日启动,非常感谢各位网友的大力支持和积极参与,个人空间的所有工作人员在这祝大家好运,希望你们每天都能拿到C币存入社区银行! 欢迎各位获奖者去自己的银行查看金额是否到账,如果有任何疑问都可以用【留言】【私信】等各种…

马云唱京剧《空城计》,柳传志说相声:“商界春晚”大佬们真会玩(附视频)...

当马云、柳传志、曹国伟等人聚在一起&#xff0c;会发生什么&#xff1f; 在互联网大会上共论未来十年的发展趋势&#xff1f;还是在镜头前激烈探讨行业变化&#xff1f; 然而这次都不是。 他们聚在一起&#xff0c;是为了上“春晚”表演节目…… 1月10日&#xff0c;被称为被誉…

常见项目管理组织机构简介

常见项目管理组织机构简介 一、职能型组织 职能型组织如下图所示&#xff0c;一般适用于业务比较固定的企业&#xff0c;如国企或流水生产制造行业&#xff0c;这种企业工作任务一般由职能经理安排就可以&#xff0c;当然&#xff0c;现在国企也在转变&#xff0c;不一定是全职…

什么是项目管理?怎么管?(一)

前言 项目管理是团队建立共同语言的需要、保证每个项目结果的需要、积累企业过程资产必要&#xff0c;同时还是打造企业战略执行力和项目管理核心竞争力的需要。 项目管理就是要做好项目的事、做好团队的事、做好企业组织的事、做好商业的事&#xff0c;就是又要当爹又要当妈。…

高项_第18-20章组织级项目管理流程管理项目集管理

第十八章 组织级项目管理 组织级项目管理是指在组织战略的指导下&#xff0c;具体落实组织的战略行动,从业务管理、组织架构、人员配置等多个方面对组织进行项目化的管理。 组织级项目管理是组织在其内部搭建起项目组合管理、项目集管理和单项目管理的各个领域,以及在这些领域…

组织战略和项目管理

2.1.1 战略的起源于特点【选择】 在西方&#xff0c;“战略” 一词是从希腊词汇“strategos” 中衍生出来的&#xff0c;意指指挥军队的艺术和科学。 战略的定义&#xff1a; 组织为了实现其使命或长期目标&#xff0c;在不环境的互动中所展开的决策行为、 采取的行动模式或遵循…

[项目管理-14]:大规模组织的项目管理办公室PMO

作者主页(文火冰糖的硅基工坊)&#xff1a;文火冰糖&#xff08;王文兵&#xff09;的博客_文火冰糖的硅基工坊_CSDN博客 本文网址&#xff1a; 目录 第1章 什么是PMO 1.1 PMO定义 1.2 PMO的由来 1.3 PMP的职责 第2章 PMO的组织架构 1.1 架构 1.2 人员组成 1.3 类型 …

项目管理(三)组织结构与项目管理

组织结构与项目管理 职能型组织的优缺点 优点&#xff1a; 1.简单 2.对专家更易于管理&#xff0c;管理更具灵活性 3.只向一个上司汇报 4.项目人员有“家”——他们在部门里工作&#xff0c;部门给予相应的技术支持 5.员工可以不断得到提高 缺点&#xff1a; 1.项目经理没有足…

项目管理 | 项目团队组建的过程是怎样的?

项目团队的组成与发展基本遵循布鲁斯塔克曼的团队建设理论模型&#xff0c;即项目团队会经历组建、震荡、规范、成熟和解散五个阶段&#xff0c;也可称为启动、磨合、发展、成熟和收尾五个阶段&#xff0c;这两组名称只是翻译不同&#xff0c;其实它们有相互对应的关系。 项目团…

项目管理(如何进行团队管理)

团队构建与管理6步走 各项工作概述: 获取团队成员需要考虑的因素: 可用性。确认资源能否在项目所需时段内为项目所用。 成本。确认增加资源的成本是否在规定的预算内。 能力。确认团队成员是否提供了项目所需的能力。 有些选择标准对团队资源来说是独特的,包括: 经验。…

组织级项目管理

概述 组织级项目管理&#xff08; organizational Project Management ) : 是指立足于组织管理角度&#xff0c;从实现组织运营价值最大化的目标出发&#xff0c;考虑如何筹建组织级的项目管理体系&#xff0c;实现组织资源优化整合、提高项目成功率&#xff0c;并在项目立项和…

PMP——项目组织结构

项目中人员或组织的组织结构对日后的项目影响深远&#xff0c;简而言之有三种类型&#xff1a;项目型、职能型、矩阵型 一&#xff1a; 项目型:将所有的能兵强将集结在一起&#xff0c;财务部、业务部、IT管理部等的精英们脱离原有的岗位。形成一个正式的部门&#xff0c;并由…