ipckey = ftok("/home/zhang/shmipcx", 10001);
if(ipckey == -1)
{
perror("ftok");
exit(1);
}
shmid = shmget(ipckey, 1024, IPC_EXCL | 0666);
if(shmid == -1)
{
perror("shmget");
exit(1);
}
addr_c = (char*)shmat(shmid, NULL, 0);
if(*((int*)addr_c) == -1)
{
perror("shmat");
exit(1);
}
/* 定义信号量数据结构 */
struct sembuf P, V;
//union semun arg1, arg2, arg3;
semkey = ftok("/home/zhang/shmipcy", 10001);
if(semkey == -1)
{
perror("ftok");
exit(1);
}
/* 创建信号灯集 */
semid = semget(semkey, 0, IPC_EXCL | 0666); //如果引用一个现存的集合(一个客户进程), 则将nsems指定为0
if(semid < 0)
{
perror("semget semid");
exit(1);
}
/* 初始化 P V操作 */
P.sem_num = 0;
P.sem_op = -1; //方式是减1(解锁)
P.sem_flg = SEM_UNDO;
V.sem_num = 0;
V.sem_op = 1; //方式是加1(解锁)
V.sem_flg = SEM_UNDO;
int i = 0;
while(i < 10)
{
P.sem_num = 0;
semop(semid, &P, 1); //对fullid执行 P 操作
P.sem_num = 2;
semop(semid, &P, 1); //对mutexid执行 P 操作
printf("***addr_c[%d] = %c\n", i, addr_c[i]);
V.sem_num = 2;
semop(semid, &V, 1); //对mutexid执行 V 操作
V.sem_num = 1;
semop(semid, &V, 1); //对empty执行 V 操作
i++;
sleep(2);
}
if(shmdt(addr_c) == -1)
{
perror("shmdt");
exit(1);
}
return 0;
}