Posix多线程编程学习笔记(六)—共享内存(3)
来源:互联网 发布:2015网络事件营销案例 编辑:程序博客网 时间:2024/05/18 16:35
五、共享内存区的写入和读出
上面我们介绍了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
六、程序例子
下面是利用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 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
- Posix多线程编程学习笔记(六)—共享内存(3)
- Posix多线程编程学习笔记(六)—共享内存(3)
- Posix多线程编程学习笔记(六)—共享内存(3)
- Posix多线程编程学习笔记(六)—共享内存(1)
- Posix多线程编程学习笔记(六)—共享内存(2)
- Posix多线程编程学习笔记(六)—共享内存(1)
- Posix多线程编程学习笔记(六)—共享内存(2)
- Posix多线程编程学习笔记(六)—共享内存(1)
- Posix多线程编程学习笔记(六)—共享内存(2)
- Posix多线程编程(6)—共享内存
- Posix多线程编程(6)—共享内存
- Linux 多线程编程( POSIX )( 六 )----->代码区 ( 共享内存实例 )
- Linux 多线程编程( POSIX )( 六 )----->共享内存区
- Linux 多线程编程( POSIX )( 六 )----->共享内存区
- Posix多线程编程(6)—共享内存
- Posix多线程编程学习笔记(一)
- Posix多线程编程学习笔记(一)
- Posix多线程编程学习笔记(二)
- 哈佛图书馆的二十条训言
- Ant的数据类型
- ppt制作注意事项
- extjs4 checkbox绑定click事件
- oracle insert into Where
- Posix多线程编程学习笔记(六)—共享内存(3)
- Python学习--控制语句:if, while, for, break, continue
- 安装Oracle 11g R2 找不到文件错误
- 堆和栈的理论知识
- 线程同步(互斥锁与信号量的作用与区别)
- 软件配置管理工作心得
- 一日一点RakNet(60)--PHP Directory Server(目录服务器)
- 一些随机有关的php函数
- Autodesk产品线(专业工业产品除外)