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函数。

操作共享内存,用到了下面的函数
#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 shmsiz 是这块内存的大小.
int flag 是这块内存的模式(mode)以及权限标识。
模式可取如下值: 新建:IPC_CREAT
使用已开辟的内存:IPC_ALLOC
如果标识符以存在,则返回错误值:IPC_EXCL
然后将“模式” 和“权限标识”进行“或”运算,做为第三个参数。
如: IPC_CREAT | IPC_EXCL | 0666
这个函数成功时返回共享内存的ID,失败时返回-1。

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);

                                                                -->消息的控制(状态获取,属性设置,队列的销毁)

 

原创粉丝点击