shm.h
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/shm.h>
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
key_t Ftok(const char *pathname, int proj_id)
{
key_t key = ftok(pathname, proj_id);
if(key == -1)
{
perror("ftok Error!\n.");
exit(1);
}
return key;
}
int Semget(key_t key, int nsems, int semflg)
{
int id = semget(key, nsems, semflg);
if(id == -1)
{
perror("semget Error!\n");
exit(1);
}
return id;
}
int Shmget(key_t key, size_t size, int shmflg)
{
int shm_id = shmget(key, size, shmflg);
if(shm_id == -1)
{
perror("shmget Error!\n");
exit(1);
}
return shm_id;
}
void *Shmat(int shmid, const void *shmaddr, int shmflg)
{
void *addr = shmat(shmid, shmaddr, shmflg);
if(addr == (void *)-1)
{
perror("shmat Error!\n");
exit(1);
}
return addr;
}
shm.c
#include"shm.h"
int main()
{
key_t shm_key = Ftok("myshm", 0xff);
printf("shm_key: %x\n",shm_key);
int shm_id = Shmget(shm_key, 1024, IPC_CREAT|IPC_EXCL|0755 );
char *addr = (char *)Shmat(shm_id, NULL, 0);
int sem_id = Semget(shm_key, 2, IPC_CREAT|IPC_EXCL|0755);
union semun init;
init.val = 0;
semctl(sem_id, 0, SETVAL, init);
semctl(sem_id, 1, SETVAL, init);
struct sembuf v = {0, 1, 0};
struct sembuf p = {1, -1, 0};
while(1)
{
printf("Ser: >");
scanf("%s", addr);
semop(sem_id, &v, 1);
semop(sem_id, &p, 1);
printf("Cli: >%s\n", addr);
}
shmdt(addr);
semctl(sem_id, 0, IPC_RMID);
semctl(sem_id, 1, IPC_RMID);
int ret = shmctl(shm_id, IPC_RMID, NULL);
if(ret == -1)
printf("Remove shm Error!\n");
else
printf("Remove shm Success!\n");
return 0;
}
cli.c
#include"shm.h"
int main()
{
key_t shm_key = Ftok("myshm", 0xff);
int shm_id = Shmget(shm_key, 0, 0);
char *addr = (char *)Shmat(shm_id, NULL, 0);
int sem_id = Semget(shm_key, 0, 0);
struct sembuf v = {1, 1, 0};
struct sembuf p = {0, -1, 0};
while(1)
{
semop(sem_id, &p, 1);
printf("Ser: >%s\n", addr);
printf("Cli: >");
scanf("%s", addr);
semop(sem_id, &v, 1);
}
shmdt(addr);
return 0;
}