【标准IO】
定义 在C库中定义的一组专门用于输入输出的函数
特点 1.通过缓冲机制减少系统调用的次数,提高效率。
2.围绕流进行操作的,流用FILE *描述,FILE是结构体,保存文件的属性信息。
3.默认打开了三个流,stdin(标准输入)、stdout(标准输出)、stderr(标准错误)
缓冲区
全缓存 和文件相关
刷新缓存的条件:
1.程序正常退出
2.缓存区满刷新
3.fflush强制刷新
行缓存 和终端相关
刷新缓存的条件:
1.程序正常退出
2.\n刷新
3.缓冲区满刷新
4.fflush强制刷新
不缓存 没有缓存区,标准错误
计算标准输出的缓存区大小:
printf(“\n”);//调用输出
printf(“%d”,stdout->_IO_buf_end-stdout->_IO_buf_base);
【文件IO】
定义
在posix(可移植操作系统接口)中定义的一组用于输入输出的函数
posix:可移植操作系统接口
unix:操作系统
linux:操作系统
特点
1、没有缓冲机制,每次操作都引起系统调用
2、围绕文件描述符进行操作,文件描述符是非负整数(>=0),顺序分配
3、默认打开三个文件描述符:0(标准输入)、1(标准输出)、2(标准错误)
4、可以操作任意类型的文件,除目录
【文件IO与标准IO对比】
标准I/O | 文件IO | |
概念 | C库中定义的一组用于输入输出的函数 | 系统中定义的一组用于输入输出的函数 |
特点 | 1)有缓冲机制,减少系统调用 2)围绕文件流进行操作 3)默认打开三个文件流,stdin、stdout、stderr 4)只能对普通文件进行操作 | 1)无缓冲机制,每次都要系统调用 2)围绕文件描述符进行操作 3)默认打开3个文件描述符,0,1,2 4)可以对任意类型文件操作,目录除外 |
函数 | 打开文件:fopen freopen 关闭文件:fclose 文件读写:fgetc fputc fgets fputs fread fwrite 文件定位操作:fseek ftell rewind | 打开文件:open 关闭文件:close 文件读写:read write 文件定位操作:lseek |
终端输入:diff 文件一 文件二:对比两个文件有无不同
【库】
库文件:头文件:#include <stdio.h>
#include "head.h"
xxx.h: 头文件、函数声明、结构体、宏定义、全局变量、重定义、共用体、枚举、条件编译
源文件:包含main函数的xxx.c,包含子函数的xxx.c
定义
库:就是把一些常用函数的目标文件打包在一起,提供相应函数的接口,便于程序员 使用;本质上来说库是一种可执行代码的二进制形式
分类
静态库和动态库,本质区别是代码被载入时刻不同。
1、静态库在程序编译时会被连接到目标代码中。
优点:程序运行时将不再需要该静态库;运行时无需加载库,运行速度更快。
缺点:静态库中的代码复制到了程序中,因此体积较大;静态库升级后,程序需要重新编译链接
2、动态库是在程序运行时才被载入代码中。优点:程序在执行时加载动态库,代码体积小;程序升级更简单;不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
缺点:运行时还需要动态库的存在,移植性较差
【库的制作】
静态库的制作
1、将源文件编译生成目标文件
eg:gcc -c fun.c -o fun.o
2、创建静态库用ar命令,它将很多.o转换成.a
eg:ar crs libmyfun.a fun.o
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a
3、测试使用静态库:
eg:gcc main.c -L. -lmyfun // -L指定库的路径 -l指定库名
4、执行./a.out
动态库的制作
1、我们用gcc来创建共享库
gcc -fPIC -c fun.c -o fun.o
-fPIC 创建与地址无关的编译程序
gcc -shared -o libmyfun.so fun.o
2、测试动态库使用
gcc main.c -L. -lmyfun
可以正常编译通过,但是运行时报错./a.out: error while loading shared libraries:libmyadd.so:cannot open shared object file: No such file or directory
原因:当加载动态库时,系统会默认从/lib或/usr/lib路径下查找库文件
解决方法(有三种):
1、把库拷贝到/usr/lib和/lib目录下。(此方法编译时不需要指定库的路径)
2、在LD_LIBRARY_PATH环境变量中加上库所在路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库路径
(终端关闭,环境变量就没在了)
(3) 添加/etc/ld.so.conf.d/*.conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新
sudo vi xx.conf
刷新:sudo ldconfig
添加动态库存在的路径,如:/home/hq/work/teach/23031/day3/share
总结
静态库:编译时刻载入,升级麻烦,体积大
需要重新编译生成可执行文件
动态库:运行时刻载入,升级简单,体积小
不需要重新编译生成可执行文件
【进程】
1、概念
程序:编写好的可执行文件
进程:独立的可调度的任务
执行一个程序所分配的资源的总称。
进程是程序的一次执行过程。
进程是动态的,包括创建、调度、执行、和消亡
2、特点
1. 系统会为每个进程分配0-4G的虚拟空间,0-3G是用户空间,每个进程所独有,3-4G是内核空间,所有进程共享。
2. cpu调度进程时,会为每个进程分配时间片(几毫秒-十几毫秒),当时间片用完,cpu再进行其他进程的调度,实现进程的轮转,从来实现多任务操作。
3、进程段
Linux中的进程包含三个段:
“数据段”:存放的是全局变量、常数以及动态数据分配的数据空间(如malloc函数取得的空间)等。
“正文段”:存放的是程序中的代码
“堆栈段”:存放的是函数的返回地址、函数的参数以及程序中的局部变量
4、进程分类
1. 交互进程:该类进程是由shell控制和运行的。交互进程既可以在前台运行,也可以在后台运行。该类进程经常与用户进行交互,需要等待用户的输入,当接收到用户的输入后,该类进程会立刻响应,典型的交互式进程有:shell命令进程、文本编辑器等。
2. 批处理进程:该类进程不属于某个终端,它被提交到一个队列中以便顺序执行。
3. 守护进程:该类进程在后台运行。它一般在Linux启动时开始执行,系统关闭时才结束。
5、进程状态
1. 运行态(TASK_RUNNING):R:指正在被CPU运行或者就绪的状态。这样的进程被成为runnning进程。
2. 睡眠态(等待态):
可中断睡眠态(TASK_INTERRUPTIBLE)S:处于等待状态中的进程,一旦被该进程等待的资源被释放,那么该进程就会进入运行状态。
不可中断睡眠态(TASK_UNINTERRUPTIBLE)D:该状态的进程只能用wake_up()函数唤醒。
3)暂停态(TASK_STOPPED):T
当进程收到信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时就会进入暂停状态。可向其发送SIGCONT信号让进程转换到可运行状态。
4)死亡态:进程结束 X
5)僵尸态(TASK_ZOMBIE):当进程已经终止运行,但还占用系统资源,要避免僵尸态的产生
6、进程状态切换图
进程创建后,进程进入就绪态,当CPU调度到此进程时进入运行态,当时间片用完时,此进程会进入就绪态,如果此进程正在执行一些IO操作(阻塞操作)会进入阻塞态,完成IO操作(阻塞结束)后又可进入就绪态,等待CPU的调度,当进程运行结束即进入结束态。
7、函数接口
1、创建fork
2、回收资源wait waitpid
3、结束进程exit _exit
4、获取进程号getpid getppid