linux进程间通讯当时,Linux进程间通讯的几种方式(及比较)

linux进程间通信(IPC)有几种方式,下面将将简单的简述一下:

一。管道(pipe)

管道是Linux支持的最初IPC方式,管道可分为无名管道,有名管道等。

(一)无名管道,它具有几个特点:

1) 管道是半双工的,只能支持数据的单向流动;两进程间需要通信时需要建立起两个管道;

2) 无名管道使用pipe()函数创建,只能用于父子进程或者兄弟进程之间;

3) 管道对于通信的两端进程而言,实质上是一种独立的文件,只存在于内存中;

4)

数据的读写操作:一个进程向管道中写数据,所写的数据添加在管道缓冲区的尾部;另一个进程在管道中缓冲区的头部读数据。

(二)有名管道

有名管道也是半双工的,不过它允许没有亲缘关系的进程间进行通信。具体点说就是,有名管道提供了一个路径名与之进行关联,以FIFO(先进先出)的形式存在于文件系统中。这样即使是不相干的进程也可以通过FIFO相互通信,只要他们能访问已经提供的路径。

值得注意的是,只有在管道有读端时,往管道中写数据才有意义。否则,向管道写数据的进程会接收到内核发出来的SIGPIPE信号;应用程序可以自定义该信号处理函数,或者直接忽略该信号。

二。信号量(semophore)

信号量是一种计数器,可以控制进程间多个线程或者多个进程对资源的同步访问,它常实现为一种锁机制。实质上,信号量是一个被保护的变量,并且只能通过初始化和两个标准的原子操作(P/V)来访问。(P,V操作也常称为wait(s),signal(s))

三。信号(Signal)

信号是Unix系统中使用的最古老的进程间通信的方法之一。操作系统通过信号来通知某一进程发生了某一种预定好的事件;接收到信号的进程可以选择不同的方式处理该信号,一是可以采用默认处理机制-进程中断或退出,一是忽略该信号,还有就是自定义该信号的处理函数,执行相应的动作。

内核为进程生产信号,来响应不同的事件,这些事件就是信号源。信号源可以是:异常,其他进程,终端的中断(Ctrl-C,Ctrl+\等),作业的控制(前台,后台进程的管理等),分配额问题(cpu超时或文件过大等),内核通知(例如I/O就绪等),报警(计时器)。

四。消息队列(Message Queue)

消息队列就是消息的一个链表,它允许一个或者多个进程向它写消息,一个或多个进程向它读消息。Linux维护了一个消息队列向量表:msgque,来表示系统中所有的消息队列。

消息队列克服了信号传递信息少,管道只能支持无格式字节流和缓冲区受限的缺点。

五。共享内存(shared memory)

共享内存映射为一段可以被其他进程访问的内存。该共享内存由一个进程所创建,然后其他进程可以挂载到该共享内存中。共享内存是最快的IPC机制,但由于linux本身不能实现对其同步控制,需要用户程序进行并发访问控制,因此它一般结合了其他通信机制实现了进程间的通信,例如信号量。

五。套接字(socket)

socket也是一种进程间的通信机制,不过它与其他通信方式主要的区别是:它可以实现不同主机间的进程通信。一个套接口可以看做是进程间通信的端点(endpoint),每个套接口的名字是唯一的;其他进程可以访问,连接和进行数据通信。

昨天总结了一些进程之间的通信方式,其实就是给一些函数做了基本的用法记录,今天看了看还是好好的看一下这

几个的区别。

几种方式:

文件、管道、共享内存空间:

1.文件方式的进程通信就是通过读写同一个文件来完成共享数据。一个进程将数据写入文件,另一个进程再将

数据从文件中读出。

客户端能够读取文件,且能够多个客户端同时读取,系统允许同时打开一个文件。

服务器端通过清空重写的方式对文件内容进行修改

问题:不能避免在文件尚未进行完写操作时就有进程读取文件内容,这时会造成读取的文件内容为空或者是读

出文件中的部分数据。

解决方案:可以通过文件锁的方式进行控制。

2.命名管道:常规的管道只能连接相关进程,由进程创建并由最后一个进程关闭。而命名管道可以连接不相关

的进程。它是个FIFO先进先出队列,即使没有进程,命名管道依然可以存在,它不依赖于进程。服务器将字节

写入队列,客户端从队列头部移出字节。服务器必须重写数据。它没有竞争的问题,在没有超过管道最大长度

的时候,read和write都是原子操作,先将管道清空,然后再将管道写满,在读者和写者联通之前系统内核将

进程刮起。

共享内存段:不依赖于进程的存在而存在。共享内存段拥有权限系统来控制进程各自的访问权限。多个客户端

都可以同时从内存中读数据。

问题:如果读取是在服务器向内存中写数据的时候进行的,有可能既读到旧数据又读到新数据。

解决方案:信号量机制。

比较:

1.文件和命名管道消耗操作多。

2.文件和共享内存是无连接的

3.命名管道和共享内存只能在本机中使用

4.使用共享内存和文件要比使用管道麻烦,要处理竞态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值