linux进程间通信

进程间通信:

每个人进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓存区,进程1将数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制叫做进程间通信(IPC)。

管道:

一种最基本的IPC机制,由pipe函数创建。

#include<unistd.h>

int pipe(int filedes[2]);

调用pipe函数时在内核中开辟一块缓冲区(管道)用于通信,它有一个读端一个写端,通过filedes参数传出给用户程序两个文件描述符,filedes[0]表示指向管道的读端,filedes[1]表示指向管道的写端。所以管道在用户程序看起来就像打开文件一样,通过read(filedes[0])或者write(filedes[1]);向这个文件读写数据其实是在读写内核缓冲区。pipe函数调用成功返回0;失败返回-1.

管道通信的一般想法:

1、父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。

2、父进程调用fork创建子进程,那么子进程也用两个文件描述符指向同一个管道。

3、父进程关闭管道读端,子进程关闭管道写端。父进程向管道写,子进程向管道读,这样就可以实现坚持间通信。

管道的限制:

两个进程通过一个管道只能实现单向通信。

如果希望双向通信可以再开辟一个管道。

管道的读写端通过打开的文件描述符来传递,因此要通信的两个进程必须从他们大的公共祖先那里继承管道文件描述符。管道通信需要进程之间有关系。

使用管道需要注意的四种特殊情况:

1、如果所用指向管道写端的文件描述符否关闭了(写端的引用计数等于零),但仍然有进程从管道的读端读数据,那么管道中剩余的数据都被读取后,再次read会返回0,就像读到文件末尾一样。

2、如果有指向写端的文件描述符没有关闭(写端的引用计数大于0),但是没有向管道写入数据,这时用进程从管道读数据,那么管道剩余的数据会被读取,再次read会阻塞,直到管道中有数据可读才读取数据返回。

3、如果所有指向管道读端的文件描述符都关闭了(读端的引用计数等于0)这时候有进程向管道的写端write,那么该进程会收到信号SIGPIPE,通常会导致进程异常终止。

4、如果有指向管道读端的文件描述符没关闭(读端的引用计数大于0),但是读端的进程不读取数据,这时进程向管道写入数据,那么在管道写满时,再次write会阻塞,直到管道中有空位置才再次写入数据并返回。

命名管道概念:

命名管道是一个设备文件,只要可以访问路径,就能够通过FIFO相互通信。(FIFO总是按照先进先出的原则工作,第一个被写入的数据将首先从管道中读出)。

命名管道和管道的使用方法基本相同。但因为命名管道是一个存在于硬盘的文件,而管道是存在于内存的特殊文件,在使用命名管道前必须先调用open()函数打开命名管道。

要注意的是,调用open()打开命名管道的进程可能会被阻塞。但是用读写方式(O_RDWR)打开,一定不会阻塞;如果只用读方式(O_RDONLY)打开,则调用open()函数的进程会被阻塞直到有写方打开管道;同样以写方式(O_WRONLY)打开,也会阻塞直到有读方式打开管道。

时间: 2024-10-15 02:18:25

linux进程间通信的相关文章

Linux进程间通信总结

Linux进程间通信总结 1. 管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: (1)管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道: (2)只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程): (3)单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中. (4)数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出

Linux进程间通信 -- 消息队列 msgget()、msgsend()、msgrcv()、msgctl()

下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信 -- 使用命名管道 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条

Linux进程间通信 -- 信号量函数 signal()、sigaction()

一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止. 信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动.通常信号是由一个错误产生的.但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程.一个信号的产生叫生成,接收到一个信号

Linux 进程间通信(posix消息队列 简单)实例

Linux 进程间通信(posix消息队列 简单)实例 详情见: http://www.linuxidc.com/Linux/2011-10/44828.htm 编译: gcc -o consumer consumer.c -lrt gcc -o producer producer.c -lrt /* * * Filename: producer.c * * Description: 生产者进程 * * Version: 1.0 * Created: 09/30/2011 04:52:23 PM

Linux进程间通信——信号

一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止. 信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动.通常信号是由一个错误产生的.但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程.一个信号的产生叫生成,接收到一个信号

Linux进程间通信 -- 数据报套接字 socket()、bind()、sendto()、recvfrom()、close()

前一篇文章,Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报套接字 socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行.也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信.也因为这样,套接字明确地将客户端和服务器区分开来. 相对于流套接字,数据报套接字的

Linux进程间通信 -- 信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()

我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程.那么我们应该如何设定我们需要处理的信号,我们不需要处理哪些信号等问题呢?信号集函数就是帮助我们解决这些问题的. 有关Linux进程间使用信号通信的更多内容,可以参阅我的另一篇文章,Linux进程间通信 -- 信号量函数 signal().sigaction() 下面是信号函数集: 1.int sigemptyset(si

嵌入式 Linux进程间通信(十二)——多线程同步

嵌入式 Linux进程间通信(十二)--多线程同步 多线程编程中有三种线程同步机制:互斥锁.信号量.条件量.本文将使用生产者消费者问题编程实践三种线程同步方式. 生产者.消费者问题:生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来. 一.互斥锁

练习--LINUX进程间通信之无名管道PIPE

IBM上放的这个系统不错,刚好可以系统回温一下LINUX的系统知识. http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/ 感觉年纪大了,前几年看的LINUX内核和系统的东东,忘了很多,要慢慢转化成永久记忆才可以. 今天,又拿起<LINUX内核设计与实现>,慢慢啃下去. ~~~~~~~~~~~~~~ 进程通信有如下一些目的:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想

Linux进程间通信程序设计-1

一.进程间通信概述: 1.目的:为什么要进行进程间通信? 1)数据传输:一个进程需要把他的数据发送给另一个进程. 2)资源共享:协调共享资源. 3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件. 4)进程控制 2.发展 Linux进程间通信(IPC)由以下几部分发展而来: 1)UNIX进程间通信 2)基于System V进程间通信(System 5是UNIX操作系统众多版本中的一支) 3)POSIX进程间通信(POSIX可移植的操作系统接口) 3.分类 现在Linux