ARM linux进程间通信API
来源:互联网 发布:如何用淘宝联盟购物车 编辑:程序博客网 时间:2024/06/04 21:48
1.管道通信
linux管道主要包括俩种:无名管道和有名管道(FIFO)
int pipe(fd[2])
fd[2]是存放管道的两个文件描述符的数组,它只能应用与有血缘关系的两个进程,通信原理是:父进程用这个函数创建一个管道,建好后,此时已经给参数fd数组赋值了,所赋的值就是管道两端的两个文件描述符,一个读管道,一个写管道,但是这样实现的仅是一个进程读写,但是,创建的子进程,因为拷贝了父进程的地址空间和资源,因此,子进程拥有跟父进程同意的管道,因此,适当的关闭两个文件描述符,就可以轻松实现进程的通信了。
由于以上管道进局限于家属之间通信,因此,聪明的程序员又构造了FIFO管道机制,顾名思义,这个管道严格遵循先进先出的规则,
int mkfifo(const char *filename,/*要创建的管道*/
mode_t mode)/*管道创建的类型*/
FIFO管道相当于一个文件,通过这个函数可以在指定的目录上建立一个文件,因此,任意进程可以读这个管道,其他进程就可以写这个管道,非常方便的实现了进程的通信,当然,在读写管道之前,必须要像文件一样,用open打开管道,操作跟文件操作一样。
2.信号通信(略)
3.共享内存
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。
采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。
共享内存实现分为3个步骤:
1)创建共享内存,使用shmget函数;
2)映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。
3)撤销映射的操作,其函数为shmdt函数。
操作共享内存,用到了下面的函数 int shmsiz 是这块内存的大小. 4.消息队列 消息队列的操作 1、 打开(获取)或创建消息队列 2、 读写操作 3、 获得或设置消息队列属性 具体对应如下API(只列出常用的) 1)int msgget(key_t key, int msgflg) -->获取或创建 2)int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg); -->消息的接收(截获) 3)int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg); -->消息的发送 4)int msgctl(int msqid, int cmd, struct msqid_ds *buf); -->消息的控制(状态获取,属性设置,队列的销毁)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget( key_t shmkey , int shmsiz , int flag );
void *shmat( int shmid , char *shmaddr , int shmflag );
int shmdt( char *shmaddr );
shmget()是用来开辟/指向一块共享内存的函数。参数定义如下:
key_t shmkey 是这块共享内存的标识符。如果是父子关系的进程间通信的话,这个标识符用IPC_PRIVATE来代替。
int flag 是这块内存的模式(mode)以及权限标识。
模式可取如下值: 新建:IPC_CREAT
使用已开辟的内存:IPC_ALLOC
如果标识符以存在,则返回错误值:IPC_EXCL
然后将“模式” 和“权限标识”进行“或”运算,做为第三个参数。
如: IPC_CREAT | IPC_EXCL | 0666
这个函数成功时返回共享内存的ID,失败时返回-1。
- ARM linux进程间通信API
- 进程间通信API
- ARM linux进程控制相关API
- 进程间通信API总结
- Linux进程间通信
- Linux进程间通信
- Linux进程间通信
- Linux进程间通信
- linux 进程间通信
- linux 进程间通信
- Linux进程间通信
- Linux进程间通信
- 【Linux】 进程间通信
- linux进程间通信
- Linux 进程间通信
- Linux进程间通信
- Linux进程间通信
- Linux 进程间通信
- .net开发人员或许用得上的一些网址
- 线段树
- Bash脚本编程基础
- 弹性编程原则
- 跟我学交换机配置(一)
- ARM linux进程间通信API
- 定制搜索框——MOSS UI
- 锁定表头
- test
- 【Java】MyEclipse+EclipseMe+WTK搭建J2ME开发环境
- CSS 控制最小宽度( IE 与 Mozilla Firefox 都好使)
- 重读《Programming Pearls》之九:Code Tuning
- 测试下空类的大小
- 难解的编译错误(二)