进程间通信

一、Linux下进程间通信方式有哪些方式?(IPC表示进程间通信)

 信号、管道(有名、无名)、信号量、消息队列、共享内存、socket

1、信号

(1)信号是系统预先定义好的一些特定的事件,信号可以被产生,也可以被接收,产生和接收的主题都是进程。接收到信号的进程会采取相应的一些行动。一般信号是由于某些错误条件而产生的,比如内存段冲突、浮点处理器错误或非法指令等。信号也可以作为进程间传递消息或修改行为的一种方式,明确地由一个进程发送给另一个进程。接收到信号地进程有三种响应方式:忽略(SIG_IGN)默认(SIG_DFL)、自定义/捕捉(自定义地函数)

(2)向指定进程发送指定地信号

int kill(pid_t pid, int sig);

(3)signal();可以改变信号的响应方式

(4)Ctrl + \ 发送了3号信号,将该进程终止

(5)Ctrl + c 结束在前台运行的程序。本质就是它会向前台的程序发送SIGIN 2(终端中断)也就是2号信号

(6)9号信号不允许通过signal改变响应方式,只能通过默认方式只要收到9号信号,程序就会终止 kill -9 PID

    15号信号kill命令默认发送的

(7)信号的具体实现方式

   在进程的PCB中有两个变量,一个是32位的整型数组,另一个是个结构体数组。整型数组中一开始的时候全部初始化为0,每个位代表一种信号,在kill发送信号的过程中就是将长整型的某个位置为1。结构体数组里存的是信号所对应的处理方法。当内核发现某个位变为1,则说明收到了相应的信号,接着就查找结构体数组,找该信号所对应的处理方法。结构体数组中存储两个变量,一个为0~31另一个为这个号码对应的处理方法

(8)子进程一结束,父进程就会收到SIGCHLD信号

2、管道

  (1)管道是进程间传递数据地一种通讯方式,管道分为有名管道和无名管道,有名管道在文件系统中会生成一个管道文件。但是这个文件只是一个文件标识,而不占据磁盘空间,所以可以在任意两个进程间完成通讯。无名管道则是利用父子进程共享fork之前打开地文件描述符,所以只能应用于父子进程之间

(2)管道是半双工地,对讲机也是半双工的,手机是全双工的

(3)打开管道会在内存中给分配一块空间,数据存放在这段内存上

(4)往管道中写数据的时候会不会出现乱序?

单个线程或进程写入数据不会出现乱序,一次写入依次读出

多个线程或进程交替写入时,整个数据块可能交替写入

(5)在创建管道的时候int pipe(int fds[2])函数必须在fork之前调用,作用是创建一个无名管道,并使用fd[0]为读端,fd[1]为写端

3、信号量

  信号量可以完成进程间的同步控制,(进程同步就是一个进程的执行必须等待另一个进程使某种条件的发生)信号量相当于一个特殊的计数器,在其值大于零时,记录资源能被几个进程使用,当其值小于零时,记录等待资源的进程数量。当一个进程使用资源之前必须先对信号量的值进行减一操作(P操作),然后判断其是否是大于或等于零,如果小于零,必须等待,而当一个进程使用完资源之后,必须对信号量的值进行加一操作(V操作),意味着自己将资源释放出来

4、消息队列

 (1)消息队列也可以实现进程间传递数据,不过传递的数据是带有type的,不同的进程可以根据需要获取不同类型的数据,如果队列中同一类型的数据有多条,则采用先进先出的原则获取数据

(2)通过msgsnd()给消息队列中添加消息,通过msgrcv()从消息队列中读取消息,读取消息的时候“0”代表不区分消息类型,都读出来

(3)结构还是个结构体,存读消息的过程简图

4)查看消息队列的命令

   ipcs –q 

5)消息队列与管道的区别

a:消息队列与命名管道有许多相似之处,但少了在打开和关闭管道方面的复杂性,但消息队列并没有解决我们在使用管道时遇到的某些问题,比如管道满时的阻塞问题

b:与命名管道相比,消息队列的优势在于,它独立于发送和接收进程而存在,这消除了在同步同名管道的打开和关闭时可能产生的一些困难

c:可以使用一些方法,提前查看紧急消息

5、共享内存

  共享内存是用同一块物理内存映射到不同的两个进程上的虚拟地址空间上来完成进程间通讯的。在每个进程中,都可以将这块空间看做自己的一部分,使用时,少了用户空间数据与内核创建的空间拷贝的过程,所以共享内存是最快的一种IPC。第一次创建共享内存段时,它不能被任何进程访问,要想启用对该共享内存的访问,必须通过shmat函数将其连接到一个进程的地址空间中

6socket

网路编程,通过网络实现不同主机上的两个进程间通讯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值