Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125502
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 354
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-01 15:34
个人简介

不晓得说啥子

文章分类

全部博文(42)

文章存档

2015年(41)

2014年(1)

我的朋友

分类: C/C++

2015-07-28 18:48:19


点击(此处)折叠或打开

  1. #include<sys/mman.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<unistd.h>
  5. #include<errno.h>
  6. #include<string.h>
  7. #include<fcntl.h>
  8. #include<pthread.h>
  9. #include<assert.h>
  10. #include<sys/types.h>
  11. #include<sys/stat.h>
  12. #include<signal.h>

  13. struct sh_mem{
  14.     pthread_mutex_t mutex;
  15.     int val;
  16. };

  17. int main(int argc, char *argv[])
  18. {
  19.     int     pid;
  20.     int     nloop;
  21.     struct sh_mem *ptr;
  22.     int     fd;
  23.     int     ret;

  24.     #ifndef _POSIX_THREAD_PROCESS_SHARED
  25.         fprintf(stderr," Not define _POSIX_THREAD_PROCESS_SHARED");
  26.         exit(-1);
  27.     #endif

  28.     if(argc != 3){
  29.         fprintf(stderr, "Usage: you need three paremter\n");
  30.         exit(EXIT_FAILURE);
  31.     }

  32.     nloop = atoi(argv[2]);

  33.     fd = open(argv[1], O_RDWR | O_CREAT, 0644);
  34.     ret = ftruncate(fd,sizeof(int));
  35.     if(fd == -1){
  36.         fprintf(stderr, "open error: %s\n", strerror(errno));
  37.         exit(-1);
  38.     }

  39.     ptr = mmap(NULL, sizeof(struct sh_mem), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  40.     if(ptr == MAP_FAILED){
  41.         fprintf(stderr, " mmap failed %s \n", strerror(errno));
  42.         exit(EXIT_FAILURE);
  43.     }
  44.     close(fd);
  45.     ptr->val = 0;


  46.     int pshared = PTHREAD_PROCESS_SHARED;
  47.     pthread_mutexattr_t attr;
  48.     
  49.     ret = pthread_mutexattr_init( &attr );
  50.     if(ret != 0){
  51.         fprintf(stderr, "pthread_mutexattr_init() error: %s\n" ,strerror(errno));
  52.         exit(-1);
  53.     }

  54.     ret = pthread_mutexattr_setpshared( &attr, pshared);
  55.     if(ret != 0){
  56.         fprintf(stderr, "pthread_mutexattr_setpshared() error: %s\n" ,strerror(errno));
  57.         exit(-1);
  58.     }

  59.     ret = pthread_mutexattr_getpshared( &attr, &pshared);
  60.     if(ret != 0){
  61.         fprintf(stderr, "pthread_mutexattr_getpshared() error: %s\n" ,strerror(errno));
  62.         exit(-1);
  63.     }
  64.     assert(pshared == PTHREAD_PROCESS_SHARED);

  65.     ret = pthread_mutex_init( &(ptr->mutex), &attr);
  66.     assert(ret == 0);
  67.     
  68.     ret = pthread_mutexattr_destroy(&attr);
  69.     assert(ret == 0);
  70.     
  71.     int i;
  72.     signal(SIGCHLD, SIG_IGN);
  73.     pid = fork();
  74.     assert(pid >=0);
  75.     
  76.     if(pid == 0){
  77.         for(i=0; i<nloop; i++){
  78.             pthread_mutex_lock(&ptr->mutex);
  79.             ptr->val++;
  80.             printf("Child process: %d\n", ptr->val);
  81.             pthread_mutex_unlock(&ptr->mutex);
  82.         }
  83.         return 0 ;
  84.     }
  85.     for(i=0; i<nloop; i++){
  86.         pthread_mutex_lock(&ptr->mutex);
  87.         ptr->val++;
  88.         printf("Main process: %d\n", ptr->val);
  89.         pthread_mutex_unlock(&ptr->mutex);
  90.     }
  91.     return 0;
  92. }
这个代码是一个测试性的代码,有几点需要注意的地方:

1、采用的是pthread_mutex_t mutex 和mmap实现的数据同步和共享
2、mutex属性必须设置为进程共享的
3、open一个文件作为内存映射过后,必须对该问价设置大小,或者是通过fd向该文件写入一些数据,再做mmap映射,不然会出现总线错误。原因应该是open创建的文件大小是0,映射到地址空间过后不可用



阅读(1413) | 评论(0) | 转发(0) |
0

上一篇:函数的可重入性

下一篇:没有了

给主人留下些什么吧!~~