导图社区 进程IO和网络(2)
这是一篇关于进程IO和网络(2)的思维导图,包括:目录操作、静态库和动态库进程、线程、线程间同步与互斥机制。
编辑于2022-05-07 18:26:08进程IO和网络
目录操作
opendir()
功能:打开一个目录,返回一个目录流指针 参数:name:目录名 返回值:成功:目录流指针;失败:NULL
closedir()
功能:关闭目录流指针 参数:dirp:目录流指针,opendir的返回值 返回值:成功:0;失败:‐1
readdir()
功能:获取目录中文件的信息 参数:dirp:目录流指针,opendir的返回值 返回值:成功:保存文件信息的结构体
静态库和动态库
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此体积较大。
创建静态库: 1)生成制作库文件所需的功能函数的可重定向文件gcc -c fun.c -o fun.o 2)生成静态库文件:ar crs libfun.a fun.o lib 表示库文件,一般不能省略;fun 表示库的名字;.a 表示静态库 3)静态库生效 gcc main.c -o main -L. –lfun;-L 指定库的路径;-l 指定库的名字
(共享库)动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在,因此代码体积较小。
创建动态库: 1)生成制作库文件所需的功能函数的可重定向文件gcc -fPIC -c fun.c -o fun.o -fPIC 生成与位置无关的代码(生成的动态库文件在内存上 可以自动寻找一块合适的内存区域) 2)生成动态库文件gcc -shared fun.o -o libfun.so .so 表示动态库文件 fun 动态库的名字 3)gcc main.c -o main -lfun
进程
进程的概念
进程是一个独立的可调度的任务; 进程是一个抽象实体。当系统在执行某个程序时,分配和释放的各种资源; 进程是一个程序的一次执行的过程
程序和进程不是一个概念 程序是死的,就是保存在磁盘上的文件 进程是活的,程序就行起来就是进程,进程是在内存中运行的
进程的空间问题
每一个进程在开启或者创建的时候,操作系统都会给其分配4G的虚拟内存,这4G的虚拟内存分为3G的用户空间和1G的内核空间,其中用户空间是当前进程所私有的,内核空间是当前系统中所有进程共有的, 4G的虚拟空间最终会映射到物理内存中,实际使用多少字节的空间,就映射多少
进程的作用
进程就是让用户通过函数可以对linux内核中的系统调用就行操作,从而控制硬件
进程调度机制
时间片轮转,上下文切换
进程的结构
进程的类型
交互进程:该类进程是由shell控制和运行的。交互进程既可以在前台运行,也可以 在后台运行。 批处理进程:该类进程不属于某个终端,它被提交到一个队列中以便顺序执行。 守护进程:该类进程在后台运行。它一般在Linux启动时开始执行,系统关闭时才结束。
进程的属性结构体
一个程序运行就是一个进程,所以每一个进程有很多属性,这些属性都定义在一个结构体里面 每一个进程开启时,都会有一个进程表项或者叫做进程控制块,来标识一个进程,记录当前进程的相关信息
进程的状态
运行状态
等待状态
停止状态
僵尸状态
进程相关函数
fork()
以通过fork函数可以在一个进程中创建多个进程
fork基本使用1:不区分父子进程的操作
fork基本使用2:区分父子进程的操作
getpid()
获取当前进程的进程号
getppid()
获取当前进程的父进程号
exit()
功能:结束一个进程,是一个库函数 参数: status:当前进程的退出状态,父进程可以通过wait函数获取 返回值:无
_exit()
功能:结束一个进程,是一个系统调用 参数: status:当前进程的退出状态,父进程可以通过wait函数获取 返回值:无
wait()
功能:阻塞等待子进程的退出状态 参数:wstatus:子进程的退出状态,子进程使用exit之后wait才可以接收到; 一般情况传NULL即可,表示不接收子进程的退出状态 返回值:成功:退出的子进程的进程号;失败:‐1
waitpid()
功能:阻塞等待子进程的退出状态 参数: pid:指定接收的子进程的状态 <‐1 接收这个参数的绝对值的进程组中所有的子进程的退出 ‐1 接收所有的子进程的退出(常用) 0 接收进程组号刚好是当前进程的组中子进程的退出 >0 接收指定进程号为当前参数的子进程的退出 status:子进程的退出状态,子进程使用exit之后wait才可以接收到 一般情况传NULL即可,表示不接收子进程的退出状态 options:标志位 0 阻塞 WNOHANG 非阻塞 返回值:成功:退出的子进程的进程号;失败:‐1
Linux特殊进程
僵尸进程 zombie
子进程退出,但是父进程没有退出,此时子进程会变成僵尸进程 子进程退出,如果父进程没有退出,子进程的资源没有释放,主要是进程控制块
处理僵尸进程的方式: 第一种:将父进程结束,父进程退出,僵尸进程会变成孤儿进程,孤儿进程会有init回收资源 第二种:使用wait函数,这个函数是父进程要阻塞等待子进程退出,当子进程退出之后可以处理僵尸进程 第三种:使用信号,通过异步解决僵尸进程的问题,需要结合wait或者waitpid一起使用
孤儿进程 orphan
父进程结束,子进程没有结束,此时子进程会变成孤儿进程 孤儿进程将来退出之后,会由init进程回收资源 孤儿进程的父进程就是1号进程,也就是init进程 由于孤儿进程的父进程是init进程,所以不受当前终端影响
守护进程 daemon
守护进程,就是通常所说的deamon进程,是linux中的后台服务进程。 他是一个生存周期较长的进程,通常独立于控制终端并且周期性的执行某种任务或者等待处理某些突发事件 守护进程尝尝在系统启动时开始运行,系统关闭时停止
创建步骤 1、创建孤儿进程 2、在子进程中创建新会话,将当前的进程设置为会话组组长---setsid() 3、改变当前进程的工作目录为根目录 ---chdir() 4、重设文件权限掩码 umask() ---算法为与运算 5、关闭该进程打开的所有文件描述符
exec函数族
exec函数族提供了一种在进程中启动另一个程序执行的方法。它可以根据指定的文件名或 目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之 后,原调用进程的内容除了进程号外,其他全部都被替换了。
system函数
功能:执行一个shell命令 system函数内部会通过fork创建一个子进程,在子进程中 通过execl执行shell命令 参数: command:保存命令的字符串
线程
线程的概念
程序执行的最小单位
主控线程
默认情况下,一个进程当中只有一个线程,叫做主控线程,由主控线程创建的线程称之为子线程,不管是主控线程还是子线程,都附属于当期的进程
线程相关函数
pthread_create()
功能:创建一个子线程 参数: thread:线程id attr:线程的属性,如果默认设置为NULL start_routine:线程处理函数 arg:给线程处理函数传参用的 返回值: 成功:0 失败:非0
pthread_self()
功能:获取一个线程的ID 参数:无 返回值: 成功:线程id
pthread_exit()
功能:当前线程退出 参数: retval:退出后返回的值,这个值可以被当前进程的其他线 程通过pthread_join函数获取到 返回值:无
pthread_cancel()
功能:向一个线程发送销毁请求,默认会让另一个线程关闭 参数: thread:执行的线程 返回值: 成功:0; 失败:非0
pthread_join()
功能:阻塞等待指定线程的退出并回收可结合态线程的资源 参数: thread:指定的线程id retval:保存指定线程退出的状态,pthread_exit所设置的值 返回值: 成功:0 失败:非0
pthread_detach()
功能:将一个线程的状态设置为分离态 参数: thread:指定线程的id 返回值: 成功:0 失败:非0
线程间同步与互斥机制
互斥、同步
互斥:多个线程,同时只能有一个运行 同步:在互斥的基础上有顺序
互斥锁
运行机制
当多个线程对同一个共享资源进行操作时,如果有一个线程先执行共享资源的操作,那么就 对共享资源的操作上锁,只要上锁其他线程就会阻塞等待,然后先执行的线程执行完毕之 后,会对共享资源的操作解锁,解锁之后,其他线程就可以上锁再次操作
相关函数
条件变量
运行机制
条件变量的主要操作是一个发送信号通知,一个负责接收信号通知,如果接收信号通知的线程没有接收到信号通知,则会阻塞,知道接收到为止 先执行的线程对共享资源的操作执行完毕之后再发送信号通知后执行的线程先阻塞等待接收信号通
相关函数