完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
更多技术文章地址:http://www.hqyj.com/news/emb211.htm?lcg-opendv
1.实验目的 通过编写共享内存实验,进一步了解使用共享内存的具体步骤,同时加深对共享内存的理解。在本实验中,采用信号量作为同步机制完善两个进程(“生产者”和“消费者”)之间的通信,其功能类似于4.6节中的实例。在实例中使用信号量同步机制。 2.实验内容 该实现要求利用共享内存实现文件的打开和读写操作。 3.实验步骤 (1)画出流程图。该实验流程图如图1所示。 图1 实验流程图 (2)编写代码。下面是共享内存缓冲区的数据结构的定义: /* shm_com.h */ #include #include #include #include #include #include #include #define SHM_BUFF_SZ 2048 struct shm_buff { int pid; char buffer[SHM_BUFF_SZ]; }; 以下是“生产者”程序部分: /* sem_com.h 和 sem_com.c 与4.4节示例中的同名程序相同 */ /* producer.c */ #include "shm_com.h" #include "sem_com.h" #include int ignore_signal(void) { /* 忽略一些信号,以免非法退出程序 */ signal(SIGINT, SIG_IGN); signal(SIGSTOP, SIG_IGN); signal(SIGQUIT, SIG_IGN); return 0; } int main() { void *shared_memory = NULL; struct shm_buff *shm_buff_inst; char buffer[BUFSIZ]; int shmid, semid; /* 定义信号量,用于实现访问共享内存的进程间的互斥 */ ignore_signal(); /* 防止程序非正常退出 */ semid = semget(ftok(".", 'a'), 1, 0666|IPC_CREAT); /* 创建一个信号量 */ init_sem(semid);/* 初始值为1 */ /* 创建共享内存 */ shmid = shmget(ftok(".", 'b'), sizeof(struct shm_buff), 0666|IPC_CREAT); if (shmid == -1) { perror("shmget failed"); del_sem(semid); exit(1); } /* 将共享内存地址映射到当前进程地址空间 */ shared_memory = shmat(shmid, (void*)0, 0); if (shared_memory == (void*)-1) { perror("shmat"); del_sem(semid); exit(1); } printf("Memory attached at %Xn", (int)shared_memory); /* 获得共享内存的映射地址 */ shm_buff_inst = (struct shared_use_st *)shared_memory; do { sem_p(semid); printf("Enter some text to the shared memory(enter 'quit' to exit):"); /* 向共享内存写入数据 */ if (fgets(shm_buff_inst->buffer, SHM_BUFF_SZ, stdin) == NULL) { perror("fgets"); sem_v(semid); break; } shm_buff_inst->pid = getpid(); sem_v(semid); } while(strncmp(shm_buff_inst->buffer, "quit", 4) != 0); /* 删除信号量 */ del_sem(semid); /* 删除共享内存到当前进程地址空间中的映射 */ if (shmdt(shared_memory) == 1) { perror("shmdt"); exit(1); } exit(0); } 以下是“消费者”程序部分: /* customer.c */ #include "shm_com.h" #include "sem_com.h" int main() { void *shared_memory = NULL; struct shm_buff *shm_buff_inst; int shmid, semid; /* 获得信号量 */ semid = semget(ftok(".", 'a'), 1, 0666); if (semid == -1) { perror("Producer is'nt exist"); exit(1); } /* 获得共享内存 */ shmid = shmget(ftok(".", 'b'), sizeof(struct shm_buff), 0666|IPC_CREAT); if (shmid == -1) { perror("shmget"); exit(1); } /* 将共享内存地址映射到当前进程地址空间 */ shared_memory = shmat(shmid, (void*)0, 0); if (shared_memory == (void*)-1) { perror("shmat"); exit(1); } printf("Memory attached at %Xn", (int)shared_memory); /* 获得共享内存的映射地址 */ shm_buff_inst = (struct shm_buff *)shared_memory; do { sem_p(semid); printf("Shared memory was written by process %d :%s", shm_buff_inst->pid, shm_buff_inst->buffer); if (strncmp(shm_buff_inst->buffer, "quit", 4) == 0) { break; } shm_buff_inst->pid = 0; memset(shm_buff_inst->buffer, 0, SHM_BUFF_SZ); sem_v(semid); } while(1); /* 删除共享内存到当前进程地址空间中的映射 */ if (shmdt(shared_memory) == -1) { perror("shmdt"); exit(1); } /* 删除共享内存 */ if (shmctl(shmid, IPC_RMID, NULL) == -1) { perror("shmctl(IPC_RMID)"); exit(1); } exit(0); } 4.实验结果 实验运行结果如下: $./producer Memory attached at B7F90000 Enter some text to the shared memory(enter 'quit' to exit):First message Enter some text to the shared memory(enter 'quit' to exit):Second message Enter some text to the shared memory(enter 'quit' to exit):quit $./customer Memory attached at B7FAF000 Shared memory was written by process 3815 :First message Shared memory was written by process 3815 :Second message Shared memory was written by process 3815 :quit |
|
相关推荐
7个回答
|
|
大家帮忙顶顶,更多技术文章都在链接内。
|
|
|
|
好贴不要沉,大家帮忙顶顶。
|
|
|
|
大家帮忙顶顶
|
|
|
|
大家帮忙顶一下,谢谢。
|
|
|
|
大家看完记得动动发财的小手帮忙顶顶哦
|
|
|
|
大家帮忙顶顶,好贴不要沉。
|
|
|
|
回复攒金币了
|
|
|
|
只有小组成员才能发言,加入小组>>
702 浏览 0 评论
1111 浏览 1 评论
2476 浏览 5 评论
2811 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2654 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
659浏览 9评论
667浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
789浏览 6评论
634浏览 5评论
678浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 08:16 , Processed in 1.214003 second(s), Total 90, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号