以下为两个进程,write进程向共享内存写数据,reader进程向共享内存读取数据,代码如下:
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <sys/>
#include <sys/>
#include <sys/>
#define N 64
typedef struct
{
pid_t pid;
char buf[N];
}SHM;
void handler(int signo)
{
//printf("get signal\n");
return;
}
void keycontrol(int signo)
{
printf("keycontrol is : %d\n",signo);
if(signo == SIGINT)
{
return;
}
}
int main()
{
key_t key;
int shmid;
SHM *p;
pid_t pid;
//建立IPC通讯,获取key值
if((key = ftok(".",'m')) < 0)
{
perror("fail to ftok");
exit(-1);
}
signal(SIGUSR1,handler);
signal(SIGINT,keycontrol);
// 获取共享内存
if((shmid = shmget(key,sizeof(SHM),0666|IPC_CREAT|IPC_EXCL)) < 0)
{
if(EEXIST == errno)
{
shmid = shmget(key,sizeof(SHM),0666);
p = (SHM *)shmat(shmid,NULL,0);
pid = p->pid;
p->pid = getpid();
kill(pid,SIGUSR1);
}
else
{
perror("fail to shmget");
exit(-1);
}
}
else
{
// 连接共享内存
p = (SHM*)shmat(shmid,NULL,0);
p->pid = getpid();
pause();
pid=p->pid;
}
printf("shmid = %d\n",shmid);
while(1)
{
printf("write to shm:");
fgets(p->buf,N,stdin);
kill(pid,SIGUSR1);
if(strcmp(p->buf,"quit\n")==0)
break;
pause();
}
// 断开连接
shmdt(p);
shmctl(shmid,IPC_RMID,NULL);
return 0;
}
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <sys/>
#include <sys/>
#include <sys/>
#define N 64
typedef struct
{
pid_t pid;
char buf[N];
}SHM;
void handler(int signo)
{
//printf("get signal\n");
return;
}
int main()
{
key_t key;
int shmid;
SHM *p;
pid_t pid;
// 获取key值
if((key = ftok(".",'m')) < 0)
{
perror("fail to ftok");
exit(-1);
}
signal(SIGUSR1,handler);
// 获取共享内存
if((shmid = shmget(key,sizeof(SHM),0666|IPC_CREAT|IPC_EXCL))<0)
{
if(EEXIST == errno)
{
shmid = shmget(key,sizeof(SHM),0666);
p = (SHM *)shmat(shmid,NULL,0);
pid = p->pid;
p->pid = getpid();
kill(pid,SIGUSR1);
}
else
{
perror("fail to shmget");
exit(-1);
}
}
else
{
// 连接共享内存
p = (SHM *)shmat(shmid,NULL,0);
p->pid = getpid();
pause();
pid = p->pid;
}
while(1)
{
pause();
if (strcmp(p->buf,"quit\n") == 0)
exit(0);
printf("read from shm:%s",p->buf);
kill(pid,SIGUSR1);
}
return 0;
}