博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux高级编程--07.进程间通信
阅读量:5143 次
发布时间:2019-06-13

本文共 1179 字,大约阅读时间需要 3 分钟。

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

管道

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

int pipe(int filedes[2]);

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

一个基本示例如下:

#include 
#include
#define MAXLINE 80int 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机制内存映射:几个进程映射同一个内存区

转载于:https://www.cnblogs.com/linzhenjie/p/5485649.html

你可能感兴趣的文章
Qt5 动态库的创建与使用
查看>>
面向对象设计
查看>>
Sqoop迁移Hadoop与RDBMS间的数据
查看>>
[label][JavaScript]读nowmagic - js词法作用域、调用对象与闭包
查看>>
模板模式
查看>>
PAT 1014 福尔摩斯的约会
查看>>
ssh2整合中的一些问题
查看>>
hibernate Expression详解
查看>>
LeetCode #303. Range Sum Query
查看>>
oracle 自增序列实现 可作为主键
查看>>
STM32----stlink口
查看>>
Android viewpager切换到最后一页时,跳转至其他activity
查看>>
开启GD拓展
查看>>
JQUERY 大于
查看>>
ZooKeeper做独立server执行(上)
查看>>
《经济地理与企业兴衰》学习笔记
查看>>
正确 C# 未来的期望
查看>>
树状数组
查看>>
POJ 1328 Radar Installation(经典贪婪)
查看>>
Netty源代码学习——EventLoopGroup原理:NioEventLoopGroup分析
查看>>