DAY3
1、信号
1.1 信号相关概念
信号通信:信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
信号的生存周期:
用户进程对信号的响应方式:
(1)忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP。
(2)捕捉信号:定义信号处理函数,当该信号发生时,执行相应的处理函数。
(3)执行缺省操作:Linux对每种信号都规定了默认操作。
1.2 查看信号
1.3 信号安装函数or信号注册函数
该函数有两个参数,一个参数为int类型,一个参数为函数指针类型,返回值也是一个函数指针,这两个函数指针指向的都是参数为int,返回值为void的函数。
自定义信号处理函数
这个自定义信号处理函数的意思是当你操作了该信号,该信号去执行它所自定义的函数,而不是它的默认值,这个点我刚开始学的时候也比较模糊,一直以为该过程是SIG_IGN的影响,但当自己重新敲写才明白,这是利用自定义函数把信号的作用给重定义了。
使用信号回收子进程:
1.4 alarm
alarm()也称为闹钟函数,它可以在进程中设置一个定时器。当定时器指定的时间到时,内核就向进程发送SIGALARM信号。
1.5 pause
pause()函数是用于调用进程挂起直到收到信号为止。
这里pause()堵塞了10s,接收到了定时信号之后程序继续进行。
1.6 kill(给指定的进程发送信号)
1.7 raise(给自己发送信号)
案例:子进程每10s给自己发送一个暂停信号,父进程每15s给子进程发送一个继续信号。
2、system V 进程间通信(IPC)
2.1 System V的IPC基础
消息队列、共享内存和信号量这3种机制,和文件一样,IPC在使用之前必须先创建,每种IPC对象都有自己的生产者,所有者和访问权限,使用ipcs命令可以查看系统正在使用的IPC工具。
2.2 IPC通信的工作原理
Linux系统为每个IPC机制都分配了一个唯一的ID值,所有支队该IPC机制的操作都使用该ID值,因此,通信的双方都需要通过某种办法来获取ID值。
如何活得相同的ID值,为了解决这一问题,IPC在实现约定使用key作为参数,如果在创建的时候使用相同的key值将得到同一个IPC对象的ID值。
2.3 共享内存
2.3.1 共享内存的创建步骤
(1)创建/打开共享内存。
注意:在获取ID值时候,先获取Key的值
(2)映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问。
(3)撤销共享内存映射
删除共享内存对象
写端:
读端:
2.4 消息队列
2.4.1 消息队列的创建步骤
(1)创建并打开消息队列
第一步跟共享内存一样,首先先获取Key的值,然后在定义一个int msgId = msgget()即可。
(2)添加消息
(3)读取消息
(4)删除消息队列
读端:
写端:
--------------------------------------------------------------------------------------------------------------------------------
DAY4
1、线程
1.1 线程概念
1.2 创建线程
第三个参数:指向的是一个参数为void*返回值也为void*的函数。
1.3 线程的退出函数
参数:value_ptr可以传个NULL。
1.4 线程等待函数
该函数pthread_join的功能类似于前面进程中的wait,是一种阻塞。
1.5 将线程设置为游离态
将线程设置为游离态就解决了join的阻塞。
1.6 线程的同步与互斥
1.6.1 互斥
互斥为了大家方便,我的理解就是大学宿舍只有一个厕所,只能一个一个人去上厕所,不能两个人一起或者三个人一起,只能一个人上厕所时与厕所绑定,把厕所门锁上。
(1)创建锁
(2)初始化锁
(3)上锁
(4)解锁
(5)销毁锁
1.6.2 同步
POSIX中定义了两类信号量
有名信号量:进程
无名信号量:线程
信号量代表某一类资源,其值表示系统中该资源的数量。
信号量是一个受保护的变量,只能通过三种操作来访问。
信号量的值为非负整数。
1.6.2.1 无名信号量
初始化
P操作(申请资源)
sem_wait():P操作 -1
sem_wait():在信号量大于0时,它将这个信号量的值减1,若信号量的值为0,sem_wait函数将会阻塞。
V操作(释放资源)
sem_post():V操作 +1。
sem_post():相当于V操作,它将信号量的值加1,同时唤醒等待的进程。
1.6.2.2 有名信号量
1、创建有名信号量
2、指向P/V操作
P操作(申请资源)
sem_wait():P操作 -1
sem_wait():在信号量大于0时,它将这个信号量的值减1,若信号量的值为0,sem_wait函数将会阻塞。
V操作(释放资源)汉子译法,法译英,英译汉。
sem_post():V操作 +1
sem_post():相当于V操作,它将信号量的值加1,同时唤醒等待的进程。
3、关闭信号量
流程:
r:
w:
--------------------------------------------------------------------------------------------------------------------------------线程复习结束,谢谢大家监督,接下来会总结线程进程之间的不同等等。