博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Linux-标准IO与文件IO简介

Posted on 2023-03-14 07:03  乔55  阅读(61)  评论(0编辑  收藏  举报

系统调用

  • 也叫文件IO,由OS实现并提供给外部应用程序的编程接口(OS课程中叫程序接口):api
  • 是应用程序同系统之间数据交换的桥梁

C库函数printf的过程详解

  • printf是无法直接操作硬件的,那它怎样把内容输出到显示器的呢?它做了一层层的向下的调用实现的
  • 首先调用printf函数的这个进程会被OS分配一个0~4G的虚拟地址空间
    • 其中的内核区里有一个PCB进程控制块,其中包含着一个文件描述符表,它是一个有1024个元素的数组
    • 该数组的0,1,2分别对应标准输入、标准输出、标准错误,文件描述符int型值分别是0,1,2
    • 这3个文件描述符是默认打开的。而printf函数是一个标准输出函数,它对应着文件文件描述符1
  • printf做了一个向下的调用:调用了Linux系统的API,面该API又分为以下几层
  • 应用层:write(fd,"hello",5);
    • write函数拿了文件描述符STDOUT-1,要输出的字符串"hello",及长度5
    • write函数调用一个sys_write()函数,会做一个从用户空间到内核空间的转换,write只能做用户区进行操作
  • 系统调用层:sys_write(),在该层,sys_write函数又会调用一个设备驱动函数,它是在内核层的
  • 内核层:设备驱动函数,通过设备驱动函数来操作硬件-显示器,这样就把内容输出了

文件IO与标准IO区别

  • 文件IO响应速度快
  • 标准IO吞吐量大

2种IO举例

int main()
{
    putchar('a');
    write(1,"b",1);
    putchar('a');
    putchar('a');
    write(1,"b",1);
    write(1,"b",1);
    printf("\n");
    return 0;
}
// 输出结果:bbbbaaaa
// strace ./target,可看到底层调用过程
write(1, "b", 1b)                        = 1
write(1, "b", 1b)                        = 1
write(1, "b", 1b)                        = 1
write(1, "aaa\n", 4aaa)                 = 4
// write为文件IO,即时读写,没有缓冲
// putchar为标准IO,有缓冲区,并不会立即输出,满足相应条件时一次性输出