📄 p11-21.c
字号:
#include "outshm.h"
int main(void) /* 服务程序 */
{
struct exchange *shm, *s;
int producer,consumer,i;
int shmid;
char readbuf[BUFSIZ];
key_t key1=123,key2=456;
/* 创建信号量consumer和producer */
consumer = semget( key1, 1, IPC_EXCL|IPC_CREAT | 0660 );
producer = semget( key2, 1, IPC_EXCL|IPC_CREAT | 0660 );
if ((consumer == -1||producer == -1)&&(errno==EEXIST)){
printf("Semaphore already exists,Server may already run.\n");
exit(0);
}
/* 初始信号量consumer和producer */
init_a_semaphore(consumer, 0, 0); /* 禁止消费 */
init_a_semaphore(producer, 0, 1); /* 允许生产 */
/* 获得并连接名为"shared"的共享存储段 */
shm = (struct exchange *)shminit(ftok("shared",0),&shmid);
/* 从标准输入读数据并写至共享存储段 */
for ( i=0; ; i++ ) {
/* 读入数据 */
semaphore_P(producer); /* 等待客户进程释放共享存储段 */
printf("Enter some text:");
fgets(readbuf,BUFSIZ,stdin);
/* 填充共享存储缓冲 */
shm->seq = i;
sprintf(shm->buf, "%s",readbuf);
semaphore_V(consumer); /* 允许客户进程取数据 */
if (strncmp(readbuf, "end", 3) == 0 )
break;
}
semaphore_P(producer); /* 等待客户读毕共享存储段中的数据 */
/* 删除信号量 */
rm_semaphore(producer);
rm_semaphore(consumer);
/* 分离并删除共享存储段 */
shmdt(shm);
shmctl(shmid, IPC_RMID, (struct shmid_ds *)NULL);
exit(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -