day31练习:
利用共享内存和信号灯实现两个进程对共享内存的同步操作(写一次、读一次)
write.c
#include "../head.h"
int main(void)
{
key_t key;
int shmid = 0;
int semid = 0;
char *pshmaddr = NULL;
union semun myun;
int ret = 0;
struct sembuf mybuf;
//ftok
key = ftok("/", 'a');
if (-1 == key)
{
perror("fail to ftok");
return -1;
}
semid = semget(key, 2, IPC_CREAT | 0664);
if (-1 == semid)
{
perror("fail to semget");
return -1;
}
/* 读信号量初始化 */
myun.val = 0;
ret = semctl(semid, 0, SETVAL, myun);
if (-1 == ret)
{
perror("fail to semctl");
return -1;
}
/* 写信号量初始化 */
myun.val = 1;
ret = semctl(semid, 1, SETVAL, myun);
if (-1 == ret)
{
perror("fail to semctl");
return -1;
}
//shmget
shmid = shmget(key, 4096, IPC_CREAT | 0664);
if (-1 == shmid)
{
perror("fail to shmget");
return -1;
}
//shmat
pshmaddr = shmat(shmid, NULL, 0);
if ((char *)-1 == pshmaddr)
{
perror("fail to shmat");
return -1;
}
while (1)
{
/* 申请写资源 */
mybuf.sem_num = 1;
mybuf.sem_op = -1;
mybuf.sem_flg = SEM_UNDO;
ret = semop(semid, &mybuf, 1);
if (-1 == ret)
{
perror("fail to semop");
return -1;
}
fgets(pshmaddr, 4096, stdin);
pshmaddr[strlen(pshmaddr)-1] = '\0';
/* 释放读资源 */
mybuf.sem_num = 0;
mybuf.sem_op = +1;
mybuf.sem_flg = SEM_UNDO;
ret = semop(semid, &mybuf, 1);
if (-1 == ret)
{
perror("fail to semop");
return -1;
}
if (0 == strcmp(pshmaddr, ".quit"))
{
break;
}
}
//shmdt
shmdt(pshmaddr);
//shmctl
shmctl(shmid, IPC_RMID, NULL);
semctl(semid, 0, IPC_RMID, NULL);
return 0;
}
read.c
#include "../head.h"
int main(void)
{
key_t key;
int shmid = 0;
int semid = 0;
char *pshmaddr = NULL;
union semun myun;
int ret = 0;
struct sembuf mybuf;
//ftok
key = ftok("/", 'a');
if (-1 == key)
{
perror("fail to ftok");
return -1;
}
semid = semget(key, 2, IPC_CREAT | 0664);
if (-1 == semid)
{
perror("fail to semget");
return -1;
}
/* 读信号量初始化 */
myun.val = 0;
ret = semctl(semid, 0, SETVAL, myun);
if (-1 == ret)
{
perror("fail to semctl");
return -1;
}
/* 写信号量初始化 */
myun.val = 1;
ret = semctl(semid, 1, SETVAL, myun);
if (-1 == ret)
{
perror("fail to semctl");
return -1;
}
//shmget
shmid = shmget(key, 4096, IPC_CREAT | 0664);
if (-1 == shmid)
{
perror("fail to shmget");
return -1;
}
//shmat
pshmaddr = shmat(shmid, NULL, 0);
if ((char *)-1 == pshmaddr)
{
perror("fail to shmat");
return -1;
}
while (1)
{
/* 申请读资源 */
mybuf.sem_num = 0;
mybuf.sem_op = -1;
mybuf.sem_flg = SEM_UNDO;
ret = semop(semid, &mybuf, 1);
if (-1 == ret)
{
perror("fail to semop");
return -1;
}
if (0 == strcmp(pshmaddr, ".quit"))
{
break;
}
printf("SHMADDR:%s\n", pshmaddr);
/* 释放读资源 */
mybuf.sem_num = 1;
mybuf.sem_op = +1;
mybuf.sem_flg = SEM_UNDO;
ret = semop(semid, &mybuf, 1);
if (-1 == ret)
{
perror("fail to semop");
return -1;
}
}
//shmdt
shmdt(pshmaddr);
//shmctl
shmctl(shmid, IPC_RMID, NULL);
semctl(semid, 0, IPC_RMID, NULL);
return 0;
}
508

被折叠的 条评论
为什么被折叠?



