共享内存:
共享内存区域是被多个进程共享的一部分物理内存.
不同的进程可以通过共享内存通信,是进程间共享数据的一种最快的方法.
一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容
(比如你把你家的保险箱密码告诉我,那我们就可以通过保险箱共享money,你一放进去money,我就可以
立马收到你的money了!!!!)
实现:
->创建共享内存,使用shmget函数
->映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数
当一个进程不再需要共享的内存段时,它将会把内存段从其地址空间中脱离,调用shmdt函数
Example: sharedMemory.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFSZ 2048
int main()
{
int shmid;
char *shmadd;
if((shmid=shmget(IPC_PRIVATE,BUFSZ,0666))<0)
{
perror("shmget");
exit(1);
}
else
{
printf("created shared-memory: %d\n",shmid);
system("ipcs -m");
}
if((shmadd=shmat(shmid,0,0))<(char *)0)
{
perror("shmat");
exit(1);
}
else
{
printf("attached shared-memory\n");
system("ipcs -m");
}
if((shmdt(shmadd))<0)
{
perror("shmdt");
exit(1);
}
else
{
printf("deleted shared-memory\n");
system("ipcs -m");
}
exit(0);
}
消息队列:
消息队列就是消息的一个链表,它允许一个或多个进程向它写消息,一个或多个进程从中读消息。具有一
定的FIFO特性,但是可实现消息的随机查询,这些消息存在于内核中,由“队列ID”来标识
实现: 创建和打开队列、添加消息、读取消息、控制消息四种操作
msgget:创建和打开队列,消息数量受系统限制
msgsnd:添加消息,将消息添加到消息队列尾部
msgrcv:读取消息
msgctl:控制消息队列
Example: msg.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define BUFSZ 512
struct message
{
long msg_type;
char msg_text[BUFSZ];
};
int main()
{
int qid;
key_t key;
int len;
struct message msg;
if((key=ftok(".",'a'))==-1)
{
perror("ftok");
exit(1);
}
if((qid=msgget(key,IPC_CREAT|0666))==-1)
{
perror("msgget");
exit(1);
}
printf("opened queue %d\n",qid);
puts("Please enter the message to queue:");
if((fgets(msg.msg_text,BUFSZ,stdin))==NULL)
{
puts("no message");
exit(1);
}
msg.msg_type = getpid();
len = strlen(msg.msg_text);
if((msgsnd(qid,&msg,len,0))<0)
{
perror("message posted");
exit(1);
}
if(msgrcv(qid,&msg,BUFSZ,0,0)<0)
{
perror("msgrcv");
exit(1);
}
printf("message is:%s\n",msg.msg_text);
if((msgctl(qid,IPC_RMID,NULL))<0)
{
perror("msgctl");
exit(1);
}
exit(0);
}