免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 668 | 回复: 0
打印 上一主题 下一主题

Posix多线程编程学习笔记(六)—共享内存(3) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-19 10:42 |只看该作者 |倒序浏览

                五、共享内存区的写入和读出
       上面我们介绍了mmap函数,下面我们就可以通过这些函数,把进程映射到共享内存区。
然后我们就可以通过共享内存区进行进程间通信了。
       下面是共享内存区写入的例子:
/*shm_write.h写入/读出共享内存区*/
#include
#include
#include
#include

int main(int argc,char **argv)
{
int shm_id;
struct stat buf;
char *ptr;

if(argc!=2)
{
    printf(“usage:shm_open \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
#include
#include
#include
#include

int main(int argc,char **argv)
{
int shm_id;
char *ptr;
sem_t *sem;

if(argc!=2)
{
    printf(“usage:shm_open \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
#include
#include
#include
#include
#include

int main(int argc,char **argv)
{
int shm_id;
char *ptr;
sem_t *sem;

if(argc!=2)
{
    printf(“usage:shm_open \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
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/61622/showart_480428.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP