IPC:进程间通信

IPC:interprocesscommunication 进程间通信。

ipc对象的持续性:

随进程持续:管道、互斥锁、条件变量、读写锁、fcntl记录上锁、套接字、posix基于内存的信号量

随内核持续:消息队列、信号量(posix有名信号量和system v信号量)、共享内存

在CS架构中,迭代服务器可能出现拒绝服务型攻击(DoS),所以要注意可能在哪里阻塞和阻塞多久。

解决DoS攻击的方法:

1.在迭代服务器中的阻塞设置超时时间。

2.使用并行服务器。

生产者消费者问题最好的解决方法就是IPC,避免产生死锁;

生产者往缓冲区放数据,消费者使用这些数据。

----------------------

IPC的3种技术:

进程(线程)间传递消息的6种接口:

1.管道

2.消息队列

3.过程调用

进程(线程)间同步的6种接口:

1.信号量(两种)

2.互斥量

3.条件变量

4.读写锁

5.记录上锁

进程(线程)间共享内存的2种接口:

1.匿名共享内存

2.有名共享内存

####################################################

posix的IPC:

posix信号量:

-lpthread

#include <semaphore.h>

posix消息队列:

-lrt

#include <mqueue.h>

posix共享内存

-lrt

#include <sys/mman.h>

 

posix的IPC函数都是库函数,还要包括头文件:

#include <fcntl.h>

#include <sys/stat.h>

使用相应的open函数创建或打开IPC时的参数:

name:

IPC的名字,Linux中的posix的IPC的名字要以 / 开头

oflags:

O_RDONLY:只读,不能用于信号量

O_WRONLY:只写,只能用于消息队列

O_RDWR:读写,不能用于信号量

O_CREAT:不存在就创建,存在就返回存在的

O_EXCL:非它性创建

O_NONBLOCK:非阻塞式IO,只用于消息队列

O_TRUNC:若存在则短截,只用于共享内存

whenoflags=O_CREAT   mode:指定权限位

S_IRUSR

S_IWUSR

S_IXUSR

S_IRGRP

S_IWGRP

S_IXGRP

S_IROTH

S_IWOTH

S_IXOTH

以上规则只适用于消息队列和信号量,共享内存的mode必须指定,如果没有指定O_CREAT,那么共享内存的mode=0.

####################################################

system v   IPC:

system v信号量

#include <sys/sem.h>

system v消息队列

#include <sys/msg.h>

system v共享内存

#include <sys/shm.h>

system v的IPC函数都是系统调用,还要包含头的文件:

#include <sys/ipc.h>

#include <sys/types.h>

使用相应的get函数创建或打开IPC使用key_t 作为他们的名字。

ftok函数把一个已存在的路径和一个整数标识符转换成key_t值,称为IPC键。

#include <sys/types.h>

#include <sys/ipc.h>

key_t ftok(const char *pathname, int proj_id);

所以system v的IPC的名字是一个文件,

linux中system v的IPC名字需要提前创建这个文件,才能用ftok转换。

内核给每个IPC对象维护的一个信息结构:

struct ipc_perm

{

IPC键:

key_t __key;

属主ID:

uid_t uid;

gid_t gid;

创建者ID:

uid_t cuid;

gid_t cgid;

权限:

unsigned short mode;

unsigned short  __seq;

};

System v的IPC的查看和删除命令:

ipcs:查看system v的ipc

-m:共享内存

-q:消息队列

-s:信号量

ipcrm:删除system v的ipc

时间: 2024-10-06 04:13:20

IPC:进程间通信的相关文章

【IPC进程间通信之四】数据复制消息WM_COPYDATA

IPC进程间通信+数据复制消息WM_COPYDATA         IPC(Inter-Process Communication,进程间通信).         数据复制消息WM_COPYDATA是Windows中一个特殊的消息,通过这个消息能够在进程间传递数据.        1.WM_COPYDATA:         WM_COPYDATA消息含两个參数WPARAM wParam和LPARAM  lParam.WPARAM和LPARAM是匈牙利命名法,历史更迭,WPARAM指32位整形

Linux环境编程之IPC进程间通信(五):Posix消息队列1

对于管道和FIFO来说,必须应该先有读取者存在,否则先有写入者是没有意义的.而消息队列则不同,它是一个消息链表,有足够写权限的线程可往别的队列中放置消息,有足够读权限的线程可从队列中取走消息.每个消息都是一个记录,它由发送者赋予一个优先级.在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达.消息队列是随内核的持续性,一个进程可以往某个队列写入一些消息,然后终止,再让另外一个进程在以后的某个时刻读出这些消息.这跟管道和FIFO不一样,当一个管道或FIFO的最后一次关闭时

Android开发之IPC进程间通信-AIDL介绍及实例解析

一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:   2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身:linux除了支持Unix早期

Linux环境编制之IPC进程间通信(一):IPC概述

进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区.但是,系统空间却是"公共场所",所以内核显然可以提供这样的条件.除此以外,那就是双方都可以访问的外设了.在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过"注册表"或其它数据库中的某些表项和记录交换信息.广义上这也是进程间通信的手段,但是一般都不把这算作"进程间通信&

Linux环境编程之IPC进程间通信(三):FIFO

管道是没有名字的,因此它只能在有亲缘关系的进程间使用,给管道加上名字,我们称之为有名管道FIFO,当然FIFO与管道之间不止有没有名字的区别,还有其他区别下面会提到.与管道类似的是,FIFO是一个单向(半双工)数据流.不同于管道的是,每个FIFO有一个路径名与之关联,从而允许无亲缘关系的进程之间访问同一个FIFO.FIFO是一种文件类型.stat结构成员st_mode的编码指明文件是否是FIFO类型,可以用S_ISFIFO宏对此进行测试. FIFO由mkfifo函数创建,它已经隐含指定了O_CR

Linux环境编程之IPC进程间通信(四):管道和FIFO比较

系统加于管道和FIFO的唯一限制是: 1.OPEN_MAX 一个进程在任意时刻打开的最大描述符数.可以通过调用sysconf函数查询. 2.PIPE_BUF 可原子地写往一个管道或FIFO的最大数据量.Posix任务它是一个路径名变量,它的值可以随指定的路径名而变化,因为不同的路径名可以落在不同文件系统上,而这些文件系统可能有不同的特征.所以PIPE_BUF可通过pathconf函数取得. pipeconf.c #include <stdio.h> #include <stdlib.h&

Linux环境编程之IPC进程间通信(二):管道

管道作为最古老的进程间通信方法,它有以下几个特点: 1.在所有的UNIX实现中都存在. 2.没有名字,因此只能由有亲缘关系的进程使用. 3.它由函数pipe创建,read和write函数访问,但只提供单路(单向)数据流. <span style="font-size:14px;">#include <unistd.h> int pipe(int fd[2]); 返回:若成功则为0,若出错则为-1</span> 经由参数fd返回两个文件描述符:fd[0

IPC进程间通信之管道

管道pipe是UNIX系统IPC进程间通信的最古老形式,并且所有UNIX系统都提供此种通信机制. 管道有下面两种局限性: 1.历史上,管道是半双工管道,数据只能在一个方向上流动,某些系统则提供了全双工管道. 2.管道只能在具有公共祖先的进程之间使用. 半双工管道虽然有自身的局限性,但仍是最常用的IPC形式.每当你在管道线中键入一个由shell执行的命令序列时,shell为每一条命令单独创建一进程,然后将前一条命令进程的标准输出用管道与后一条命令的标准输入相连接. #include <unistd

学习IPC进程间通信的总结(第八周)

10月24日晚上,回到宿舍准备写这周的总结时,看了下课表突然意识到这已经是第八周,不得不说时间过得真快,与前两年轻松的.无任务的课程相比,今年真是充实了太多!这也许是感觉时间过得快的原因,但是最近我也遇到了许多问题,当接触的知识多了以后,发现自己要学的东西太多了,仅仅上课所学远远不够,所以课后自学了一些课程,遇到的问题一是自己好高骛远,总想急于求成,这看一点那看一点,没有系统的全面的琢磨一本书,问题二:对于应用方面的知识学到手很快,但也会很快的忘记,到了应用时只记得一些概念了.对于这两个问题,我