客户端:
#include<stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include<stdlib.h>
#include<string.h>
#include <unistd.h>
#include <sys/sem.h>
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
};
void pGetkey(int id)
{
struct sembuf set;
set.sem_num=0;
set.sem_op=-1;
set.sem_flg=SEM_UNDO;
if(semop(id,&set,1)==-1){
perror("semop");
exit(EXIT_FAILURE);
}
}
void vPutBackkey(int id)
{
struct sembuf set;
set.sem_num=0;
set.sem_op=1;
set.sem_flg=SEM_UNDO;
if(semop(id,&set,1)==-1){
perror("semop");
exit(EXIT_FAILURE);
}
}
int main()
{
char *shmaddr;
key_t key;
key=ftok(".",'z');
if(key!=-1){
printf("key=%d\n",key);
}
int shmid=shmget(key,1024*4,IPC_CREAT|0777);
if(shmid!=-1){
printf("creat shmid success\n");
}
shmaddr=shmat(shmid,0,0);
if(shmaddr>0){
printf("shmat ok\n");
}
int semid=semget(key,1,IPC_CREAT|0666);
if(semid!=-1){
printf("semget success\n");
}
union semun initsem;
initsem.val=1;
int ret=semctl(semid,0,SETVAL,initsem);
if(ret!=-1){
printf("semctl success\n");
}
while(1){
pGetkey(semid);
strcpy(shmaddr,"xiewenhui");
printf("send ok\n");
sleep(1);
vPutBackkey(semid);
}
int ret1=shmdt(shmaddr);
if(ret1==-1){
printf("shmdt failed\n");
exit(-1);
}
return 0;
}
服务端
#include<stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include<stdlib.h>
#include <unistd.h>
#include <sys/sem.h>
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
};
void pGetkey(int id)
{
struct sembuf set;
set.sem_num=0;
set.sem_op=-1;
set.sem_flg=SEM_UNDO;
if(semop(id,&set,1)==-1){
perror("semop");
exit(EXIT_FAILURE);
}
}
void vPutBackkey(int id)
{
struct sembuf set;
set.sem_num=0;
set.sem_op=1;
set.sem_flg=SEM_UNDO;
if(semop(id,&set,1)==-1){
perror("semop");
exit(EXIT_FAILURE);
}
}
int main()
{
char *shmaddr;
key_t key;
key=ftok(".",'z');
if(key!=-1){
printf("key=%d\n",key);
}
int shmid=shmget(key,1024*4,0);
if(shmid!=-1){
printf("creat shmid success\n");
}
shmaddr=shmat(shmid,0,0);
if(shmaddr>0){
printf("shmat ok\n");
}
int semid=semget(key,1,IPC_CREAT|0666);
if(semid!=-1){
printf("semget success\n");
}
union semun initsem;
initsem.val=1;
int ret=semctl(semid,0,SETVAL,initsem);
if(ret!=-1){
printf("semctl success\n");
}
while(1){
pGetkey(semid);
printf("data:%s\n",shmaddr);
sleep(1);
vPutBackkey(semid);
}
int ret2=shmdt(shmaddr);
if(ret2==-1){
printf("shmdt failed\n");
exit(-1);
}
int ret1=shmctl(shmid,IPC_RMID,NULL);
if(ret1==-1){
printf("shmctl failed\n");
exit(-1);
}
return 0;
}