linux进程间通信(posix信号灯+posix共享内存)实例
2011-10-17 17:49
381 查看
/* * * Filename: producer.c * * Description: 生产者进程 * * Version: 1.0 * Created: 09/30/2011 04:52:23 PM * Revision: none * Compiler: gcc(g++) * * Author: |Zhenghe Zhang|, |zhenghe.zhang@gmail.com| * Company: |Shenzhen XXX Technology Co., Ltd.| * */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/shm.h> #include <sys/mman.h> #include <semaphore.h> #define MAXSHM 5 //定义缓冲区数组的下标变量个数 int main() { /*共享文件*/ const char *file = "/shmipcxy"; int fd = shm_open(file, O_CREAT | O_RDWR | O_TRUNC, 0666); if(fd == -1) { perror("shm_open"); exit(1); } /*ftruncate()会将参数fd指定的文件大小改为参数length指定的大小。*/ /*参数fd为已打开的文件描述词,而且必须是以写入模式打开的文件。*/ /*如果原来的文件大小比参数length大,则超过的部分会被删去。*/ if(ftruncate(fd, sizeof(char) * MAXSHM) == -1) { perror("ftruncate"); exit(1); } /*mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。*/ /*参数start指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定地址,对应成功后该地址会返回。*/ /*参数length代表将文件中多大的部分对应到内存。*/ char *addr_c = (char*)mmap(NULL, sizeof(char) * MAXSHM, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(*((int*)addr_c) == -1) { perror("mmap"); exit(1); } const char *full_name = "/tmp_full"; const char *empty_name = "/tmp_empty"; const char *mutex_name = "/tmp_mutex"; /*定义信号灯 full, empty, mutex */ sem_t *full = sem_open(full_name, O_CREAT, 0600, 0); sem_t *empty = sem_open(empty_name, O_CREAT, 0600, MAXSHM); sem_t *mutex = sem_open(mutex_name, O_CREAT, 0600, 1); int i = 0; while(i < 10) { /*sem_wait锁定一个信号量 */ sem_wait(empty); //对 empty执行-操作 sem_wait(mutex); //对 mutex执行-操作 addr_c[i] = i + 'a'; printf("***addr_c[%d] = %c\n", i, addr_c[i]); /*sem_post解锁一个信号量 */ sem_post(mutex); //对 mutex执行+操作 sem_post(full); //对 full执行+操作 i++; sleep(1); } sleep(20); //等待消费者进程退出 /*munmap()用来取消参数start所指的映射内存起始地址,参数length则是欲取消的内存大小。*/ /*当进程结束或利用exec相关函数来执行其他程序时,映射内存会自动解除,但关闭对应的文件描述词时不会解除映射。*/ if(munmap(addr_c, sizeof(char) * MAXSHM) == -1) { perror("munmap"); exit(1); } /*解引用 POSIX 共享内存对象*/ if(shm_unlink(file) == -1) { perror("shm_unlink"); exit(1); } /*删除一个命名信号量*/ if(sem_close(full) == -1) { perror("sem_close"); exit(1); } if(sem_close(empty) == -1) { perror("sem_close"); exit(1); } if(sem_close(mutex) == -1) { perror("sem_close"); exit(1); } /*sem_unlink 删除一个由 name 引用的信号量。*/ /*信号量名字被直接删除。信号量本身在所有打开该信号量的进程都关闭它之后被销毁。*/ if(sem_unlink(full_name) == -1) { perror("sem_unlink"); exit(1); } if(sem_unlink(empty_name) == -1) { perror("sem_unlink"); exit(1); } if(sem_unlink(mutex_name) == -1) { perror("sem_unlink"); exit(1); } return 0; }
gcc -o producer producer.c -lrt -lpthread
/* * * Filename: consumer.c * * Description: 消费者进程 * * Version: 1.0 * Created: 09/30/2011 04:52:23 PM * Revision: none * Compiler: gcc(g++) * * Author: |Zhenghe Zhang|, |zhenghe.zhang@gmail.com| * Company: |Shenzhen XXX Technology Co., Ltd.| * */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/shm.h> #include <sys/mman.h> #include <semaphore.h> #define MAXSHM 5 //定义缓冲区数组的下标变量个数 int main() { /*共享文件*/ const char *file = "/shmipcxy"; int fd = shm_open(file, O_CREAT | O_RDWR, 0666); if(fd == -1) { perror("shm_open"); exit(1); } if(ftruncate(fd, sizeof(char) * MAXSHM) == -1) { perror("ftruncate"); exit(1); } char *addr_c = (char*)mmap(NULL, sizeof(char) * MAXSHM, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(*((int*)addr_c) == -1) { perror("mmap"); exit(1); } /* 定义信号灯 full,emptyid, mutexid */ const char *full_name = "/tmp_full"; const char *empty_name = "/tmp_empty"; const char *mutex_name = "/tmp_mutex"; /*定义信号灯 full, empty, mutex */ sem_t *full = sem_open(full_name, 0); sem_t *empty = sem_open(empty_name, 0); sem_t *mutex = sem_open(mutex_name, 0); int i = 0; while(i < 10) { sem_wait(full); //对full执行 - 操作 sem_wait(mutex); //对mutex执行 - 操作 printf("***addr_c[%d] = %c\n", i, addr_c[i]); sem_post(mutex); //对mutex执行 + 操作 sem_post(empty); //对empty执行 + 操作 i++; sleep(2); } if(munmap(addr_c, sizeof(char) * MAXSHM) == -1) { perror("munmap"); exit(1); } if(sem_close(full) == -1) { perror("sem_close"); exit(1); } if(sem_close(empty) == -1) { perror("sem_close"); exit(1); } if(sem_close(mutex) == -1) { perror("sem_close"); exit(1); } return 0; }
相关文章推荐
- Linux 多线程编程( POSIX )( 三 )------->代码区 ( 信号灯实例 )
- linux 进程间通信(system v 信号灯+system v 共享内存)实例
- linux进程间通信(posix消息队列)实例
- Linux 进程间通信(posix消息队列 简单)实例
- 深入理解Linux进程间通信(IPC)-- Posix信号灯
- Linux 进程间通信(posix消息队列 简单)实例
- Linux环境进程间通信(四):信号灯
- Linux环境进程间通信(四)信号灯
- Linux环境进程间通信(四) 信号灯
- Linux进程间通信方式之socket使用实例
- Linux 进程间通信 - 信号灯
- 【Linux】进程间通信-信号量详解及编程实例
- linux 进程间通信--systemV 共享内存 实例
- linux进程间通信-----System V共享内存总结实例
- 深入理解Linux进程间通信(IPC)-- Posix共享内存
- 嵌入式 Linux 进程间通信之信号灯的几点注意事项
- linux system V IPC 信号灯和共享内存实例
- linux进程间通信-----System V消息队列总结实例
- Unix/Linux 进程间通信之消息队列应用实例
- Linux进程通信 之 信号灯(semphore)(System V && POSIX)