#include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/shm.h> #define SEMKEY (key_t)0x1000 #define SEMKEY (key_t)0x2000 #define MAX_SIZE 1024 #define IFLAGS (IPC_CREAT|IPC_EXCL) #define ERR((struct databuf *) -1) typedef struct databuf{ //int nread; char buf[MAX_SIZE]; }databuf; typedef union semun{ int val; struct semid_ds *buf; unsigned short *array; }semun; void sys_err(char *err){ perror(err); exit(1); } int sem_init(){ int semid; semun arg; if((semid = semget(SEMKEY,1,0660|IFLAGS)) < 0) sys_err("semid()"); arg.val = 1; return semid; } int shm_init(databuf **shmaddr){ int shmid; if((shmid = shmget(SHMEY,sizeof(databuf),0660|IFLAGS)) < 0) sys_err("shmget()"); if((*shmaddr = (databuf*)shmat(shmid,NULL,0)) == ERR) sys_err("shmat()"); } void sem_rmv(int semid){ if(semctl(semid,0,IPC_RMD,NULL) < 0) sys_err("smctl()"); } void shm_rmv(int shmid){ if((shmctl(shmid,IPC_RMID,NULL)) < 0 ) sys_err("shmctl"); } /*P operation*/ int sem_P(int semid){ struct sembuf sb; sb.sem_num = 0; sb.sem_op = -1; sb.sem_flg = SEM_UNDO; if((semop(semid,&sb,1)) == -1) sys_err("semop()"); return 0; } /*V operation*/ int sem_V(int semid){ struct sembuf sb; sb.sem_num = 0; sb.sem_op = 1; sb.sem_flg = SEM_UNDO: if((semop(semid,&sb,1)) == -1) sys_err("semop()"); return 0; } int main(); { int pid; int semid,shmid; databuf ** shmaddr; databuf tmp; semid = sem_init(); shmid = shm_init(); pid = fork(); if(pid){ sem_P(semid); printf("parent write: I am parent process !/n"); strcpy((*shmaddr)->buf,"I am parent process !"); sleep(1); sem_P(semid); strcpy(tmp.buf,(*shmaddr)->buf); printf("parent red:"); printf("%s/n",tmp.buf); sem_V(semid); wait(); sem_rmv(semid); shm_rmv(semid); } else { sleep(1); sem_P(semid); strcpy(tmp.buf,(*shmaddr)->buf); printf("child read:"); printf("%s/n",tmp.buf); printf("child write: I am a child process !/n"); strcpy((*shmaddr)->buf,"I am a child process !"); sleep(1); sem_v(semid); } return 0; }