系统调用
- 也叫文件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区别
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;
}
write(1, "b", 1b) = 1
write(1, "b", 1b) = 1
write(1, "b", 1b) = 1
write(1, "aaa\n", 4aaa) = 4
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理