Posix多线程编程学习笔记(六)—共享内存(3)

五、共享内存区的写入和读出

       上面我们介绍了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

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值