每个进程各自有不同的用户地址空间,进程之间要交换数据必须通过在内核中开辟缓冲区,从而实现数据共享。

管道

管道是一种最基本的IPC机制,由pipe函数创建:

int pipe(int filedes[2]);

调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端(很好记,就像0是标准输入1是标准输出一样)。所以管道在用户程序看起来就像一个打开的文件,通过read(filedes[0]);或者write(filedes[1]);向这个文件读写数据其实是在读写内核缓冲区。

一个基本示例如下:

#include <stdlib.h>
#include <unistd.h>
#define MAXLINE 80 int main(void)
{
int n;
int fd[2];
pid_t pid;
char line[MAXLINE]; if (pipe(fd) < 0) {
perror("pipe");
exit(1);
}
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
if (pid > 0) { /* parent */
close(fd[0]);
write(fd[1], "hello world\n", 12);
wait(NULL);
} else { /* child */
close(fd[1]);
n = read(fd[0], line, MAXLINE);
write(STDOUT_FILENO, line, n);
}
return 0;
}

使用管道也有一些限制:

  • 管道的读写端通过打开的文件描述符来传递,因此要通信的两个进程必须从它们的公共祖先那里继承管道文件描述符。
  • 两个进程通过一个管道只能实现单向通信

其它IPC机制

除了管道外,还有如下几种常用的IPC机制:

文件:    几个进程可以在文件系统中读写某个共享文件,也可以通过给文件加锁来实现进程间同步
信号: 进程间使用SIGUSR1和SIGUSR2实现用户自定义功能
Socket: 它还可以跨主机,并且标准统一,不同的操作系统都支持,是使用的最广泛的IPC机制
内存映射:几个进程映射同一个内存区

Linux高级编程--07.进程间通信的更多相关文章

  1. linux高级编程基础系列:线程间通信

    linux高级编程基础系列:线程间通信 转载:原文地址http://blog.163.com/jimking_2010/blog/static/1716015352013102510748824/ 线 ...

  2. 〖Linux〗Linux高级编程 - 进程间通信(Interprocess Communication)

    [转自: http://blog.csdn.net/Paradise_for_why/article/details/5550619] 这一章就是著名的IPC,这个东西实际的作用和它的名字一样普及.例 ...

  3. linux高级编程

    系统调用 01.什么是系统调用? 02.Linux系统调用之I/O操作(文件操作) 03.文件描述符的复制:dup(), dup2() 多进程实现多任务 04.进程的介绍 05.Linux可执行文件结 ...

  4. linux高级编程补充知识

    F: 计算机系统结构: ------------------------------- 应用程序 ----------------- |  库函数 -------------------------- ...

  5. Linux高级编程--10.Socket编程

    Linux下的Socket编程大体上包括Tcp Socket.Udp Socket即Raw Socket这三种,其中TCP和UDP方式的Socket编程用于编写应用层的socket程序,是我们用得比较 ...

  6. Linux高级编程--05.文件读写

    缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...

  7. Linux高级编程--02.gcc和动态库

    在Linux环境下,我们通常用gcc将C代码编译成可执行文件,如下就是一个简单的例子: 小实验:hello.c #include <stdlib.h> #include <stdio ...

  8. Linux高级编程--01.vi命令

    VI是Linux/Unix下标配的一个纯字符界面的文本编辑器.由于不支持鼠标功能,也没有图形界面,相关的操作都要通过键盘指令来完成,需要记忆大量命令.因此很多人不大喜欢它,但同时由于键盘的方式往往比鼠 ...

  9. linux网络编程之进程间通信介绍

    从今天起,开始学习进程间通信相关的东东,关于socket的编程先告一段落了,在学习进程间通信之前,首先先要了解一些概念,所以,这次不开始真正的代码编写,先纯理论,理解了为之后的更深入的学习可以打下良好 ...

随机推荐

  1. 使用tornado的gen模块改善程序性能

    之前在公司的一个模块,需要从另一处url取得数据,我使用了Python的一个很著名的lib,叫做requests.但是这样做极大的降低了程序的性能,因为tornado是单线程的,它使用了所谓的reac ...

  2. VC2010 调用 Webservice

    开发环境:VC2010,gsoap_2.8.23 http://blog.csdn.net/zhaiwenjuan/article/details/6590941 使用soapcpp2的时候要加参数- ...

  3. 《精通移动app测试实战:技术、工具和案例》新书上市

    本书是测试专家.性能测试专家.专业畅销书作者--于涌,多年实战经验的总结,涵盖主流的测试工具,包括众多的测试实例,涵盖单元测试.功能测试.性能测试.UI测试.手游测试.自动化测试.测试用例管理.持续集 ...

  4. Python学习笔记(2):数据库访问

    本来打算继续用Access的,但费了非常大的劲,还是没有搞定.回过头,发现使用sqlite,简单到令人发指.干脆,把C#的CommonCode往这边迁移,先把AccessDB搬过来再说. 类结构和C# ...

  5. AngularJS和DataModel

    通常,在AngularJS中使用JSON作为存储数据的模型.我们可能这样在controller中写model: app.controller('BookController',['$scope',fu ...

  6. LDO/DC-DC区别总结(转)

    电源是一个电子系统中不可缺少的非常重要的一部分.但是外接的电源通常不能够完全提供系统中需要的所有的电源种类.因此带来了电源电压的变换问题.常用的电源电压的变换芯片包括LDO和DC-DC两种.下面对这两 ...

  7. Code First 中使用 ForeignKey指定外键时总是显示未引用

    Code First 中使用 ForeignKey指定外键时总是显示未引用 原因是:开发环境是在.NET 4.0 修改项目,改为.net 4.5

  8. Three Sources of a Solid Object-Oriented Design

    pingback :http://java.sys-con.com/node/84633?page=0,1 Object-oriented design is like an alloy consis ...

  9. Android学习笔记----Activity的生命周期图示

    转载,一目了然.

  10. 解决linux下主机名变bogon的问题

    早上起来发现 linux主机名变为bogon bogon是指那些不该出现在internet路由表中的地址吧这些地址应该包括:1,私有地址如10,172.16-32,192.168.....2,还未正式 ...