免费注册 查看新帖 |

Chinaunix

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

共享内存,再麻烦一下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-12-18 23:22 |只看该作者 |正序浏览
myread.c
  1. #include

  2. #define        PATHNAME "/home/yz"
  3. #define PROJID 1
  4. #define LENGTH 5*sizeof(int)

  5. void Initwrlock(struct flock *flock);
  6. void Getwrlock(struct flock *flock);
  7. void Releasewrlock(struct flock *flock);

  8. int fd_lck;

  9. int main()
  10. {
  11.         struct flock myflock;
  12.         int shmid;
  13.         key_t mykey;
  14.         int *myshm,myshm_pre;
  15.         struct timeval tv;

  16.         //init lock
  17.         Initwrlock(&myflock);

  18.         //get key_t
  19.         mykey = ftok(PATHNAME,PROJID);       
  20.         if(mykey == (key_t)-1)
  21.         {
  22.                 perror("ftok failed ");
  23.                 exit(errno);
  24.         }
  25.        
  26.         //get shm
  27.         shmid = shmget(mykey,LENGTH,IPC_CREAT|IPC_EXCL|00777);
  28.         if(shmid == -1)
  29.         {
  30.                 if (errno == EEXIST)
  31.                         shmid = shmget(mykey,LENGTH,0);
  32.                 if(shmid == -1)
  33.                 {
  34.                         perror("shmget failed ");
  35.                         exit(errno);
  36.                 }
  37.         }

  38.         //attach
  39.         myshm = (int *)shmat(shmid,NULL,0);       
  40.         if(myshm == (int *)-1)
  41.         {
  42.                 perror("shmat failed ");
  43.                 exit(errno);
  44.         }

  45.         myshm_pre = *myshm;

  46.         while(1)
  47.         {
  48.                 //get wrlock
  49.                 Getwrlock(&myflock);       

  50.                 //read
  51.                 if(myshm_pre != *myshm)
  52.                 {
  53.                         gettimeofday(&tv,NULL);
  54.                         printf("read new :%d\ttime:%ld,%ld\n",
  55.                                         *myshm,tv.tv_sec,tv.tv_usec);

  56.                         myshm_pre = *myshm;
  57.                 }
  58.                        
  59.                 //release wrlock
  60.                 Releasewrlock(&myflock);
  61.         }
  62.        
  63. }

  64. void Initwrlock(struct flock *flock)
  65. {
  66.         fd_lck = open("./shm.lck",O_CREAT|O_RDWR,00777);
  67.         if(fd_lck<0)
  68.         {
  69.                 perror("open failed ");
  70.                 exit(errno);
  71.         }

  72.         flock->;l_whence = SEEK_SET;
  73.         flock->;l_start = 0;
  74.         flock->;l_len = 0;
  75. }

  76. void Getwrlock(struct flock *flock)
  77. {
  78.         flock->;l_type = F_WRLCK;

  79.         if(fcntl(fd_lck,F_SETLKW,flock) == -1)
  80.         {
  81.                 perror("fcntl failed ");
  82.                 exit(errno);
  83.         }
  84. }

  85. void Releasewrlock(struct flock *flock)
  86. {
  87.         flock->;l_type = F_UNLCK;

  88.         if(fcntl(fd_lck,F_SETLKW,flock) == -1)
  89.         {
  90.                 perror("fcntl failed ");
  91.                 exit(errno);
  92.         }
  93. }
复制代码


mywrite.c
  1. #include
  2. #define        PATHNAME "/home/yz"
  3. #define PROJID 1
  4. #define LENGTH 5*sizeof(int)

  5. void Initwrlock(struct flock *flock);
  6. void Getwrlock(struct flock *flock);
  7. void Releasewrlock(struct flock *flock);

  8. int fd_lck;

  9. int main()
  10. {
  11.         struct flock myflock;
  12.         int shmid,i;
  13.         key_t mykey;
  14.         int *myshm;
  15.         struct timeval tv;

  16.         //init lock
  17.         Initwrlock(&myflock);

  18.         //get key_t
  19.         mykey = ftok(PATHNAME,PROJID);       
  20.         if(mykey == (key_t)-1)
  21.         {
  22.                 perror("ftok failed ");
  23.                 exit(errno);
  24.         }
  25.        
  26.         //get shm
  27.         shmid = shmget(mykey,LENGTH,IPC_CREAT|IPC_EXCL);
  28.         if(shmid == -1)
  29.         {
  30.                 if (errno == EEXIST)
  31.                         shmid = shmget(mykey,LENGTH,0);
  32.                 if(shmid == -1)
  33.                 {
  34.                         perror("shmget failed ");
  35.                         exit(errno);
  36.                 }
  37.         }

  38.         //attach
  39.         myshm = (int *)shmat(shmid,NULL,0);       
  40.         if(myshm == (int *)-1)
  41.         {
  42.                 perror("shmat failed ");
  43.                 exit(errno);
  44.         }

  45.         i=0;
  46.        
  47.         alarm(10);
  48.        
  49.         while(1)
  50.         {

  51.                 //write
  52.         //        printf("press ENTER to write new value :\n");
  53.         //        getchar();

  54.                 //get wrlock
  55.                 Getwrlock(&myflock);       

  56.                 *myshm = i;
  57.                 gettimeofday(&tv,NULL);
  58.                 printf("write new :%d\ttime:%ld,%ld\n",
  59.                                 *myshm,tv.tv_sec,tv.tv_usec);

  60.                        
  61.                 //release wrlock
  62.                 Releasewrlock(&myflock);

  63.                 i = (i+1)%10000;
  64.         }
  65.        
  66. }
复制代码


mywrite持续写10秒,期间myread输出只有几条,第一次 - 6条  /  二 - 1  /  三- 6 ,共享应该所有write 都能得到吧?

如果把 mywrite.c 中while 循环中得 printf & getchar 注释取消,myread倒是很快就有输出,为什么会有开始这种情况呢?

先谢过!

论坛徽章:
0
3 [报告]
发表于 2003-12-25 00:26 |只看该作者

共享内存,再麻烦一下

后来在while{}中加了usleep(10),所有的改变都能得到了。之前getchar被注释时可能是进程调度问题吧,只能得到很少的改变。不是太明白,先就这样再说,不知有没有深入的解释?

论坛徽章:
0
2 [报告]
发表于 2003-12-19 05:31 |只看该作者

共享内存,再麻烦一下

我觉得,你把printf & getchar 注释取消,那么共享内存中的值变化的就快一些,这样在读中的条件就满足的快,所以输出的快
      if(myshm_pre != *myshm)
      {
         gettimeofday(&tv,NULL);
         printf("read new :%d\ttime:%ld,%ld\n",
               *myshm,tv.tv_sec,tv.tv_usec);

         myshm_pre = *myshm;
      }
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP