linux 进程间通信(2)

来源:互联网 发布:python数据分析 豆瓣 编辑:程序博客网 时间:2024/05/22 05:07

1.可以用什么函数来实现信号的安装?

 signal()函数:用于传送信号给指定的进程;

 sigaction()函数:用于查询或设置信号处理方式。

 

2.使用信号的注意事项

1)防止不该丢失的信号丢失;

2)考虑到程序的可移植性,应该尽量采用POSIX信号函数;

3)为了增强程序的稳定性,在信号处理程序中应当使用可再入函数

 

3.进程处理信号的方式有哪些?

 忽略信号:即对信号不做任何处理,其中,有两个信号不能忽略,即SIGKILL SIGSTOP

 捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数。

 执行默认操作:Linux对每种信号都规定了默认操作,注意,进程对实时信号的默认反应是进程终止。

采用哪种方式来响应信号,取决于传递给相应API函数的参数。

 

4.信号灯有哪些类型?

 二值信号灯:最简单的信号灯形式,信号灯的值只能取01,类似于互斥锁;

 计算信号灯:信号灯的值可以取任意非负值。

 

5.信号灯的竞争问题该怎么解决

第一个创建信号灯的进程在初始化信号灯时,第二个进程又调用semget,并且发现信号灯已经存在,此时,第二个进程必须具有判断是否有进程正在对信号灯进行初始化的能力。绕过这种竞争状态的方法:当semget创建一个新的信号灯时,信号灯结构semid_dssem_otime成员初始化后的值为0,因此,第二个进程在成功调用semget后,可再次以IPC_STAT命令调用semctl,等待sem_otime变为非零值,此时可判断该信号灯已经初始化完毕

 

6.互斥锁与二值信号灯有什么区别?

信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值,互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁

 

7.共享内存实现

创建共享内存,使用shmget函数;

映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。

 

8.共享内存的优缺点

优点:相对其他方式有更少的数据拷贝,效率较高;随内核持续,相比于随进程持续生命力更强

缺点:自身不具备同步机制。

 

9.共享内存方式中mmmap()和系统V

系统V共享内存中的数据,从来不写入到实际磁盘文件中,而通过mmap()映射普通文件实现的共享内存通信可以指定何时将数据写入到磁盘文件中。

系统V共享内存是随内核持续的,即便所有访问共享内存的进程都已正常结束,共享内存区仍然存在,在内核重新引导之前,对该共享内存区域的任何改写操作都将一直保留。

通过调用mmap()映射普通文件进行进程间通信时,一定要注意考虑进程何时终止对进程的影响,而通过系统V共享内存实现通信的进程则不然。

 

10.各种进程间通信方法的总结

Socket:方式实现起来比较简单;自身携带同步机制,不需要额外的方式来辅助实现同步;随进程持续。

共享内存:相对其他方式有更少的数据拷贝,效率较高;自身不具备同步机制;随内核持续,相比于随进程持续生命力更强。

管道:只能用于有亲缘关系间进程的通信;只支持单向数据流;自身具备同步机制;随进程持续。

FIFO:是有名管道,支持没有亲缘关系的进程通信;需要创建两个描述符来实现实现双向通信;自身具备同步机制;随进程持续。

信号:这种通信可携带的信息极少,不适合需要经常携带数据的通信;不具备同步机制,类似于中断,什么时候产生信号,进程是不知道的。

消息队列:使用一个路径名来实现各个无亲缘关系进程之间的通信;提供有格式的字节流;消息具有类型和优先级;具备同步机制;随内核持续。

原创粉丝点击