共享内存
两个进程共享同一块内存,即同一块物理内存被映射到两个进程各自的进程地址空间中。所以两个进程都可以对这一块共享内存进行读写操作,同时可以扫描到共享内存中的数据。
用C语言实现两个进程(程序)之间的单工通信,一方发送信息,一方接收信息。代码如下:
shma.c程序:用于发送数据
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHMSIZE 512
#define BUFSIZE 128
int main(void)
{
key_t key;
int sid;
char *fip=NULL;
key = ftok("./shda.c",'k');//k是一个8位的二进制数
if(key < 0)
{
perror("ftok()");
exit(-1);
}
sid = shmget(key,SHMSIZE,IPC_CREAT|0666);
if(sid < 0)
{
perror("shmget()");
exit(-2);
}
if((fip = shmat(sid,NULL,0)) == (void *)-1)
{
perror("shmat()");
exit(-3);
}
while(1)
{
scanf("%s",fip);
}
if(shmdt(fip) < 0)
{
perror("shmdt()");
exit(-4);
}
shmctl(sid,IPC_RMID,NULL);
exit(0);
}
shmb.c程序:用于接收数据
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#define SHMSIZE 512
#define OUTSIZE 128
int main(void)
{
key_t key;
int sid;
char *fip=NULL;
char out[OUTSIZE]={'\0'};
key = ftok("./shda.c",'k');//k是一个8位的二进制数
if(key < 0)
{
perror("ftok()");
exit(-1);
}
sid = shmget(key,SHMSIZE,IPC_CREAT|0666);
if(sid < 0)
{
perror("shmget()");
exit(-2);
}
if((fip = shmat(sid,NULL,0)) == (void *)-1)
{
perror("shmat()");
exit(-3);
}
while(1)
{
if(*fip != '\0')
{
puts(fip);
memset(fip,'\0',sizeof(*fip));
}
}
if(shmdt(fip) < 0)
{
perror("shmdt()");
exit(-4);
}
shmctl(sid,IPC_RMID,NULL);
exit(0);
}