揭秘Linux进程间通信机制(linux进程间通信)
IPC
随着信息技术的发展,将信息进行传递已经成为当前IT应用的核心,而 Linux 进程间通信机制(Inter Process Communication)就肩负起了这一责任,它支撑着正常的应用顺利运行。那么,Linux进程间通信机制究竟是如何实现的呢?本文就来带大家揭秘Linux进程间通信机制IPC。
其实,Linux进程间通信机制IPC,主要分为四种:管道(pipes)、消息队列(Message Queues)、信号量(Semaphores)和共享内存(Shared Memory) 。在具体实现中也有它们之间的关系。
首先,管道(pipes)是Linux系统中最简单也是最古老的IPC方式,它提供了一种简单而快捷的方式为两个进程之间进行通信。管道对于进程间通信来说,存在一个从读取方向不允许反向的单向通信特征。一般情况下,管道由内核创建,仅用于在父子进程和兄弟进程之间进行全双工通信。比如下面的一段代码:
int pipefd[2];
pipe(pipefd); //pipefd[0] for read
//pipefd[1] for Write
其次,消息队列(Message Queues)是Linux系统中的另一种IPC机制,它支持非阻塞的异步通信,同时能够将一系列无序列的消息放到一个队列中。而且这些消息也可以按照需求按时发送给接收者。下面是一段关于消息队列的代码:
#include
struct msgbuf{
long mtypechar mtext[20];
};
int msqid;key_t key;
struct msgbuf p_msgbuf;
key = ftok("/tmp/msg.temp",1);//创建消息队列msgqid = msgget(key, IPC_CREAT|0666);//存取消息队列
//发送消息p_msgbuf.mtype = 'b';
strcpy(p_msgbuf.mtext, "hello world!");msgsnd(msgqid, &p_msgbuf. mtype, strlen(p_msgbuf.mtext)+1, 0);
//接收消息msgrcv(msgqid, &p_msgbuf, 26,'b', 0);
第三,信号量(Semaphores)是Linux系统中IPC机制之一,它是一种用来控制共享资源进行访问的信号符号,可以强制进程之间必须按照一定的规律来访问共享资源。最常见的例子就是操作系统的缓冲区。下面是一段代码:
#include
union semun{
int val;struct semid_ds *buf;
unsigned short *array;struct seminfo *_buf;
};
key_t semkey;int semid;
struct sembuf sb;union semun semopts;
int fullBuff;
semkey = ftok("/tmp/sem.temp", 1);//创建信号量semid = semget(semkey, 2, IPC_CREAT|IPC_EXCL|0666); //获取信号量
//初始化信号量semopts.val = 0;
semctl(semid, 0, SETVAL,semopts);
//信号量加一sb.sem_num = 0;
sb.sem_op = 1;sb.sem_flg = 0;
semop(semid, &sb, 1);
//信号量减一sb.sem_num = 0;
sb.sem_op = -1;sb.sem_flg = 0;
semop(semid, &sb, 1);
最后,共享内存(Shared Memory)是Linux系统中最常用的IPC机制,它可以为多个进程提供共享的内存空间,该技术极大地加快了多进程之间的通信效率。下面是一段关于共享内存的代码:
#include
int shmid;key_t key;
char *share_mem;//创建共享内存
key = ftok("/tmp/shm.temp",1);shmid = shmget(key, 1024, 0666|IPC_CREAT)
//映射共享内存share_mem = shmat(shmid, 0, 0);
//写入数据strcpy(share_mem, "hello world\n");
//解除映射shmdt(share_mem);
//删除共享内存shmctl(shmid, IPC_RMID, 0);
本文通过介绍了Linux进程间通信机制IPC的四