Posix多线程编程学习笔记(六)—共享内存(3)
2008-08-01 13:53
369 查看
五、共享内存区的写入和读出[/b]
上面我们介绍了mmap函数,下面我们就可以通过这些函数,把进程映射到共享内存区。
然后我们就可以通过共享内存区进行进程间通信了。
下面是共享内存区写入的例子:
下面是运行结果:
#cc –lrt –o shm_write shm_write.c
#./shm_write test
hello linux
[/b]
六、程序例子[/b]
下面是利用pisix共享内存区实现进程间通信的例子:服务器进程读出共享内存区内容,然后清空。客户进程向共享内存区写入数据。直到用户输入“q”程序结束。程序用posix信号量实现互斥。
#cc –lrt –o server server.c
#cc –lrt –o user user.c
#./server test&
#./user test
输入:abc
user:abc
server:abc
输入:123
user:123
server:123
输入:q
user:q
引用: http://blog.chinaunix.net/u/22935/showart_341896.html
上面我们介绍了mmap函数,下面我们就可以通过这些函数,把进程映射到共享内存区。
然后我们就可以通过共享内存区进行进程间通信了。
下面是共享内存区写入的例子:
/*shm_write.h写入/读出共享内存区*/ #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <unistd.h> int main(int argc,char **argv) { int shm_id; struct stat buf; char *ptr; if(argc!=2) { printf(“usage:shm_open <pathname>/n”); exit(1); } shm_id=shm_open(argv[1],O_RDWR|O_CREAT,0644);/*创建共享内存区*/ ftruncate(shm_id,100);/*修改共享区大小*/ fstat(shm_id,&buf); ptr=mmap(NULL,buf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,shm_id,0);/*连接共享内存区*/ strcpy(ptr,”hello linux”);/*写入共享内存区*/ printf(“%s/n”,ptr);/*读出共享内存区*/ shm_unlink(argv[1]);/*删除共享内存区*/ } |
#cc –lrt –o shm_write shm_write.c
#./shm_write test
hello linux
[/b]
六、程序例子[/b]
下面是利用pisix共享内存区实现进程间通信的例子:服务器进程读出共享内存区内容,然后清空。客户进程向共享内存区写入数据。直到用户输入“q”程序结束。程序用posix信号量实现互斥。
/*server.c服务器程序*/ #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <unistd.h> #include <semaphore.h> int main(int argc,char **argv) { int shm_id; char *ptr; sem_t *sem; if(argc!=2) { printf(“usage:shm_open <pathname>/n”); exit(1); } shm_id=shm_open(argv[1],O_RDWR|O_CREAT,0644);/*创建共享内存区*/ ftruncate(shm_id,100);/*调整共享内存区大小*/ sem=sem_open(argv[1],O_CREAD,0644,1);/*创建信号量*/ ptr=mmap(NULL,100,PROT_READ|PROT_WRITE,MAP_SHARED,shm_id,0);/*连接共享内存区*/ strcpy(ptr,”/0”); while(1) { if((strcmp(ptr,”/0”))==0)/*如果为空,则等待*/ continue; else { if((strcmp(ptr,”q/n”))==0)/*如果内存为q/n退出循环*/ break; sem_wait(sem);/*申请信号量*/ printf(“server:%s”,ptr);/*输入共享内存区内容*/ strcpy(ptr,”/0”);/*清空共享内存区*/ sem_pose(sem);/*释放信号量*/ } sem_unlink(argv[1]);/*删除信号量*/ shm_unlink(argv[1]);/*删除共享内存区*/ } } |
/*server.c服务器程序*/ #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <unistd.h> #include <semaphore.h> #include <stdio.h> int main(int argc,char **argv) { int shm_id; char *ptr; sem_t *sem; if(argc!=2) { printf(“usage:shm_open <pathname>/n”); exit(1); } shm_id=shm_open(argv[1],0);/*打开共享内存区 sem=sem_open(argv[1],0);/*打开信号量*/ ptr=mmap(NULL,100,PROT_READ|PROT_WRITE,MAP_SHARED,shm_id,0);/*连接共享内存区*/ while(1) { sem_wait(sem);/*申请信号量*/ fgets(ptr,10,stdin);/*从键盘读入数据到共享内存区*/ printf(“user:%s”,ptr); if((strcmp(ptr,”q/n”))==0) exit(0); sem_pose(sem);/*释放信号量*/ sleep(1); } exit(0); } |
#cc –lrt –o user user.c
#./server test&
#./user test
输入:abc
user:abc
server:abc
输入:123
user:123
server:123
输入:q
user:q
引用: http://blog.chinaunix.net/u/22935/showart_341896.html
相关文章推荐
- Posix多线程编程学习笔记(六)—共享内存(1)
- Posix多线程编程学习笔记(六)—共享内存(2)
- Posix多线程编程学习笔记(六)—共享内存(1)
- Posix多线程编程学习笔记(六)—共享内存(2)
- Posix多线程编程学习笔记(六)—共享内存(3)
- Posix多线程-共享内存
- posix 基于文件的共享内存
- IPC通信:Posix共享内存1
- posix 共享内存
- POSIX 共享内存和 系列函数
- 深入理解Linux进程间通信(IPC)-- Posix共享内存
- IPC通信:Posix共享内存2
- 缓冲区设计—进程间通讯(POSIX 共享内存)
- 15章 进程间通信之共享内存区(Posix、System V共享内存)
- Linux进程间通信(IPC)编程实践(八)共享内存的使用-POSIX 共享内存(API)
- IPC通信:Posix共享内存2
- IPC通信:Posix共享内存1
- Posix多线程编程(6)—共享内存
- linux网络编程之POSIX共享内存
- Linux进程通信之POSIX共享内存