参照书上的例程,实现在父子进程之间通过共享内存实现简单的通信。
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include<string.h>
typedef int sem_t;
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
}arg;
sem_t CreateSem(key_t key,int value)
{
union semun sem;
sem_t semid;
sem.val = value;
semid = semget(key,1,IPC_CREAT|0666);
if(-1 == semid)
{
perror("create semaphore error\n");
return -1;
}
semctl(semid,0,SETVAL,sem);
return semid;
}
int Sem_P(sem_t semid)
{
struct sembuf sops = { 0,+1,IPC_NOWAIT};
return (semop(semid,&sops,1));
}
int Sem_V(sem_t semid)
{
struct sembuf sops = { 0,-1,IPC_NOWAIT};
return (semop(semid,&sops,1));
}
void DestorySem(sem_t semid)
{
union semun sem;
sem.val = 0;
semctl(semid,0,IPC_RMID,sem);
}
static char msg[] = "hi,shared memeory\n";
int main()
{
key_t key;
int semid,shmid;
char i,*shms,*shmc;
struct semid_ds buf;
int value = 0;
char buff[80];
pid_t p;
key = ftok("/ipc/sem",'a'); /*生成键值*/
shmid = shmget(key,1024,IPC_CREAT|0604);/*获得共享内存,大小为1024k*/
semid = CreateSem(key,0);/*创建信号量*/
p = fork(); /*创建子进程*/
if(p > 0) /*(父进程*/
{
shms = (char*)shmat(shmid,0,0);/*挂接共享内存,shms得到实际可用的地址*/
memcpy(shms,msg,strlen(msg)+1);/*复制内容*/
sleep(10);/*等待时间,子进程将数据读出*/
Sem_P(semid);/*信号量semid的value加1*/
shmdt(shms);/*摘除共享内存*/
DestorySem(semid);/*销毁信号量*/
}
else if(p == 0)/*子进程*/
{
shmc = (char*)shmat(shmid,0,0);/*挂接共享内存*/
Sem_V(semid);/*信号量semid的value减1*,与Sem_P()配合使用*/
printf("shared memory value is :%s",shmc);/*读出数据*/
shmdt(shmc);/*摘除共享内存*/
}
return 0;
}