进程线程DAY3-DAY4

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,若信号量的值为0sem_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,若信号量的值为0sem_wait函数将会阻塞。

V操作(释放资源)汉子译法,法译英,英译汉。

sem_post():V操作 +1

sem_post():相当于V操作,它将信号量的值加1,同时唤醒等待的进程。

3、关闭信号量

 流程:

 r:

w:

 --------------------------------------------------------------------------------------------------------------------------------线程复习结束,谢谢大家监督,接下来会总结线程进程之间的不同等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值