Linux IPC小结

IPC进程间通信(Inter-Process Communication)就是指多个进程之间相互通信,交换信息的方法。Linux IPC基本上都是从Unix平台上继承而来的。主要包括最初的Unix IPC,System V IPC以及基于Socket的IPC。另外,Linux也支持POSIX IPC。

现在最常用的进程间通信的方式有:信号,信号量,消息队列,共享内存。 所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂。机制不 同,复杂度也不一样。通信是一个广义上的意义,不仅仅指传递一些massege。 他们的使用方法是基本相同的,所以只要掌握了一种的使用方法,然后记住其他的使用方法就可以了。

1. 信号

在我学习的内容中,主要接触了信号来实现同步的机制,据说信号也可以用来做其它的事 情,但是我还不知道做什么。 信号和信号量是不同的,他们虽然都可用来实现同步和互斥,但前者是使用信号处理器来 进行的,后者是使用P,V操作来实现的。 使用信号要先知道有哪些信号,在Linux下有31个需要记住的通用信号,据说也是system V中最常用的那些。这里略。

1. 1信号相关函数:
#include
int sigaction(int signo, const struct sigaction *act, struct sigaction *oact);
该函数用来为进程安装信号处理器,struct sigaction数据是用来保存信号处理器的相关信息。

#include
int sigemptyset(sigset_t *set);

将信号集合清空。

int sigfillset(sigset_t *set);
将信号集合设置成包含所有的信号。在对信号进行操作以前一定要对信号集进行初始化。

int sigaddset(sigset_t *set, int signo);

向信号集中加入signo对应的新信号。

int sigdelset(sigset_t *set, int signo);

从信号集中删除signo对应的一个信号。

int sigismember(const sigset_t *set, int signo);
判断某个信号是否在信号集中。返回1则在,0则不在。

#include
int sigprocmask(int how,const sigset_t *set, sigset_t *oset);
用来设置进程的信号屏蔽码。信号屏蔽码可以用来在某段时间内阻塞一些信号集中的信 号,如果信号不在信号集中,就不必讨论它,因为肯定不响应,是否能生成也不肯定,我 没有做过试验。

1.2我所理解的使用信号机制的方法:
使用信号,主要做的事情就是信号处理器的工作,这里面是你想做的事情。就像中断处理 函数一样。 在使用信号以前,首先要初始化信号集,只有在信号集里面的信号才会被考虑。 有两种方法可以初始化信号集,一种是设置空信号集,一种是将所有的信号都加到信号集中。如果你自己想要的信号集不是这两种,可以在初始化了以后通过添加和删除信号进行 定制。

如果在进程执行的一段时间内不想对某些信号进行响应,则可以使用sigprocmask对当前的信号集中的一些信号进行阻塞,稍后再执行。 当你将信号集设置完毕后,在让他工作之前需要安装信号处理器。安装信号处理器可以实 现这几个功能:

指定信号处理函数的入口;

指定信号屏蔽集合;

指定信号处理器的一些标志。

所谓信号处理器,就是指定了一些处理方法,关键在于安装信号处理器,这是使正确的信号进行正确 的处理关键。在安装的时候,一定要对特定的信号赋予正确的信号处理函数。 我不知道不同进程之间的信号处理器能否混用,但是像一个特定的进程中有多少个信号处 理器这样的问题是不能提的。因为信号处理器是一个概念,他针对的是信号,就是说如果 你指定了一个数据结构,用它来存储针对某个信号的处理信息,那么安装信号处理器就是 赋予这个数据结构一些相关信息,使用信号处理器就是用这个数据结构存储的信息来组织 一种机制当发生这个信号的时候会做一些你实现设置好的处理。但是如果区分不同进程中
对同一个信号的不同处理器?我想处理器可能只对核它所属的进程有关的信号进行响应, 但是如果是这样的话,那这是怎么实现的呢? 

不过有一点是可以知道的,那就是每一个信号都有一个信号处理器(确定的),可以动过安装信号处理器来指定她的行为。信号处理器由他自己的信息存储区域(我不知道在什么 地方),但是可以通过向sigaction类型的数据结构向信号处理器的信息存储区域中传递 信息。这个数据结构由一个就可以了,因为它只是临时传递数据的载体。

但是sigpromask和信号处理器里面的sigmask是不一样的,前者是在进程当前流程设置信 号屏蔽,后者是指定在信号处理器作用时需要屏蔽掉的信号。例如,在设置某个特定信号 的信号处理器时,我们当然不能让它的信号处理器工作了,因为还没有设置完吗,这是我 们可以使用sigprocmask来让当前的流程开始阻塞该信号,当设置完信号处理器以后,再 用sigprocmask恢复被阻塞的信号。而以后再接收到该信号时,信号处理器就可以工作了。 我的想法是,同一个信号在不同的进程里可以有不同的信号处理器(一般应该有一个缺省
处理),当系统中发生一个信号时,所有能接受到的进程都可以接收到这个信号,并用他 们自己的信号处理器对这个信号做出各自的响应。 

1.3如何用信号来进行进程间的同步
同步的实现主要是通过在接受信号之前挂起进程,等待相关信号。所以涉及到异步信号安 全函数的概念。

不过信号如何来实现进程间的互斥,我理解不是很多,我想信号的主要用处还是在软中断 处理和进程同步。

2.信号量
信号量和信号是不同的东西,仔细想想就可以理解:信号是实现约定的固定的值,而信号
量是一个变量记录着某些特定信息。
信号量这种东西我们在操作系统课程中就已经接触过了,这里只是再草草说几句。信号量
分为有名和无名两种。进程间通信用有名信号量,同一进程内部通信一般用无名信号量。
这个我不再多说。
2.1信号量相关函数
#include
#include
#include
int semget(key_t key, int nsems, int semflg);
创建一个新的信号量组或获取一个已经存在的信号量组。

#include
#include
#include
int semop(int semid, struct sembuf *sop, int nsops);
semop函数可以一次对一个或多个信号量进行操作。
Int semctl(int sem_id, int semnum, int cmd,/*union semun arg*/…);
该函数可以用来获取一些信号量的使用信息或者是来对信号量进行控制。

2.2我对信号量机制的理解
对信号量的操作只有两个:P, V。
为了在逻辑上便于组织信号量,信号量机制中有一个概念是信号量组。我们可以把一个信
号量组中创建相关的信号量,这样逻辑上清晰也便于管理。在使用之前你同样需要对他们
进行初始化:生成或打开信号量组,向其中生成或删除你指定的信号量。
对信号量的操作只用两种,他都是通过semop函数中的sops参数来指定的,如果这个参数
是一个数组的话,那么就是对多个信号量进行操作。Sops参数中的sem_op字段指明了对信
号量进行的是P操作还是V操作。你只要指定就行了,具体的操作不需要你去实现,函数中
都已经提供了。使用信号量,你得清楚信号量组id和信号量在信号量组中的位置(其实也
就是另一个id)。一个信号量必须属于一个信号量组,否则不能被系统所使用。切记!
信号量和信号量组是不会被系统所自动清理的,所以当你的进程退出前,千万别忘了清理
你生成的那些信号量们。
信号量既可以实现互斥,也可以实现同步,这里就不说了,操作系统课程中是有介绍的。

3.消息队列
消息队列是比较高级的一种进程间通信方法,因为它真的可以在进程间传送massege,你 传送一个"I seek you"都可以。 一个消息队列可以被多个进程所共享(IPC就是在这个基础上进行的);如果一个进程的消息太多一个消息队列放不下,也可以用多于一个的消息队列(不过可能管理会比较复 杂)。共享消息队列的进程所发送的消息中除了massege本身外还有一个标志,这个标志 可以指明该消息将由哪个进程或者是哪类进程接受。每一个共享消息队列的进程针对这个 队列也有自己的标志,可以用来声明自己的身份。 对于系统中的每一个消息队列,都有一个数据结构来代表它,这个数据结构是msqid_ds,
这里略去不讲,在中可以看到它的原型。

3.1消息队列相关函数
使用消息队列之前,你要么获得这个消息队列,要么自己建立一个,否则是不能使用消息
队列的(我觉得这都像是多余的话,请见谅)。当这个消息队列不再使用时,也一定要有
一个进程来删除消息队列,系统是不会自动的清理消息队列和msgid_ds的。

Int msgget(key_t key, int msgflg);
获取一个存在的消息队列的ID,或者是根据跟定的权限创建一个消息队列。但是怎么样去
删除这个消息队列,我还不十分清楚。
Int msgctl(int msqid, int cmd, struct msqid_ds *buf);
用来从msqid_ds中获取很多消息队列本身的信息。
Int msgsnd(int msqid, void *msgp, size_t msgsz, int msgflg);
用于向队列发送消息。
Int msgrcv(int msqid, void *msgp, size_t msgsz, long int msgtyp, int
msgflg);
从队列中接收消息。
我这个文档里面对消息队列中的一些临界情况所述不多,因为这是我的小结,而非介绍。
在GNU C库技术中可以看到它的详细介绍

时间: 2024-10-31 19:35:08

Linux IPC小结的相关文章

Linux IPC命令的用法详解_unix linux

进程间通信概述 进程间通信有如下的目的:1.数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间: 2.共享数据,多个进程想要操作共享数据,一个进程对数据的修改,其他进程应该立刻看到: 3.通知事件,一个进程需要向另一个或一组进程发送消息,通知它们发生了某件事情: 4.资源共享,多个进程之间共享同样的资源.为了做到这一点,需要内核提供锁和同步机制: 5.进程控制,有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和

Linux使用错误小结(CentOS)- vim安装问题: Error: Nothing to do

yum (Yellowdog Updater Modified)是一个集与查找,安装,更新和删除程序的Linux软件. 它运行在RPM包兼容的Linux发行版本上,如:RedHat, Fedora, SUSE,CentOS, Mandriva. 问题1:No package vimrc available.  Error: Nothing to do 解决这个一连串问题的时候:请备份libperl.so(必须): [root@localhost CORE]# pwd /usr/lib64/per

Linux知识点小结_Linux

1 我的Linux需求 这里讨论的是我对线上的Linux机器的需求,所以只讨论稳定发行版,且是比较保守的版本.比如CentOS 7的xfs不予讨论,并不是说xfs不好,而是以目前我的Linux水平需要更新很多xfs的知识,驾驭需要时间.CentOS 7将ifconfig,netstat等原来常用的命令也干掉了.下面我们以CentOS 6作为基础,谈一谈我对Linux的基本需求. 1.1 最小化安装 CentOS有一个minimal版本,相对于标准版去掉了很多Service,比如Network M

Linux使用错误小结(CentOS)- yum更新软件失败

yum使用条件:yum的使用要保证internet网络连通,和"cat /etc/resolv.conf"文件下存在"nameserver 8.8.8.8"才可正常更新.  yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器. yum 的宗旨是自动化地升级,安装/移除rpm 包,收集rpm 包的相关信息,检查依赖性并自动提示用户解决.自动解决包的倚赖性问题,便于管理大量系统的更新

R1-010 Linux重定向小结

重定向标准输出:1> 重定向标准错误:2> 重定向标准输入:0< 重定向标准输出和标准错误:&>

Linux的IPC命令

进程间通信概述 进程间通信有如下的目的:1.数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间:2.共享数据,多个进程想要操作共享数据,一个进程对数据的修改,其他进程应该立刻看到:3.通知事件,一个进程需要向另一个或一组进程发送消息,通知它们发生了某件事情:4.资源共享,多个进程之间共享同样的资源.为了做到这一点,需要内核提供锁和同步机制:5.进程控制,有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并

Android利用LocalSocket实现Java端进程与C端进程之间的IPC

Android是建立在Linux之上的OS,在涉及到安全.网络协议.文件加密等功能时,往往需要通过C语言调用底层API来实现,而如何发出指令让C端执行我们想要的功能,并且在执行之后有返回结果呢,这就需要打通Java端进程和C端进程,使之能高效地通信.这样,C端进程用于实现功能,Java端进程负责UI.功能的触发及结果处理就可以了. 对于*nix系统来说,"一切皆为文件",Socket也不例外,Socket按照收发双方的媒介来说有三种类型:1,通过网络端口:2,通过文件系统:3,通过内存

Linux驱动技术(八) _并发控制技术

为了实现对临界资源的有效管理,应用层的程序有原子变量,条件变量,信号量来控制并发,同样的问题也存在与驱动开发中,比如一个驱动同时被多个应用层程序调用,此时驱动中的全局变量会同时属于多个应用层进程的进程空间,这种情况下也要使用一些技术来实现对并发的控制.本文将讨论内核中下述并发控制技术的技术特点和应用场景. 1.中断屏蔽 2.原子操作  a.原子变量操作  b.原子位操作 3.自旋锁  a.传统自旋锁  b.读写自旋锁  c.顺序锁  d.RCU 4.信号量  a.传统信号量  b.读写信号量  

CentOS 7 最小安装 功能扩展

首先,我们使用centos一般使用yum安装文件,其条件: 1:必须能接入互联网:(设置ip) 2:有yum功能插件.(可手动下载安装) 注:没有ifconfig可以用ip addr和ip link可以查看,使用ifconfig: 需要安装"net-tools",执行下命令,会报错: 扩展功能: 网络:net-tools  编辑器[option]:vim 编译器:c/c++: gcc /gcc-c++ [root@localhost ~]# yum install -y net-too