|
楼主 |
发表于 2002-11-7 08:51:41
|
显示全部楼层
共享内存机制(用信号灯实现同步和互斥)
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/shm.h>
# include <sys/sem.h>
#define SHMKEY 180001
#define SIZE 1024
#define SEMKEY1 190001
#define SEMKEY2 190002
int creatsem ();
void P(),V();//,syserr();
main ()
{
char *segaddr;
int segid, sid1,sid2;
segid=shmget(SHMKEY,SIZE,IPC_CREAT|0666);
//syserr("shmget");
segaddr=shmat(segid,0,0);
sid1=creatsem(SEMKEY1);
sid2=creatsem(SEMKEY2);
P(sid2);
if(!fork())
while(1){
P(sid2);
printf("Recieved from Parent: %s\n",segaddr);
V(sid1);
}
while(1){
P(sid1);
scanf("%s",segaddr);
V(sid2);
}
}
int creatsem(key)
key_t key;
{
int sid;
union semun{
int val;
struct semid_ds *buf;
ushort *array;
}arg;
sid=semget(key,1,0666|IPC_CREAT);
//syserr("semget");
arg.val=1;
semctl(sid,0,SETVAL,arg);
//syserr("semctl");
return(sid);
}
void P(sid)
int sid;
{
static void semcall();
semcall(sid,-1);
}
void V (sid)
int sid;
{
static void semcall();
semcall(sid,1);
}
static void semcall (sid,op)
int sid,op;
{
struct sembuf sb;
sb.sem_num=0;
sb.sem_op=op;
sb.sem_flg=0;
semop(sid,&sb,1);
//syserr("semop");
} |
|