免费注册 查看新帖 |

Chinaunix

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

共享内存疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-14 11:45 |只看该作者 |倒序浏览
讨论:
         shmget 命令参数中规定了共享存储段的长度(字节)是32.但输出可台超出32字节的内容。

         不知size_t size 有所限制呢?


原码如下:
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define TOKEN 'r'

void destroy_shm(int shmid)
{
        struct shmid_ds buf;
        shmctl(shmid, IPC_STAT, &buf);
        if (buf.shm_nattch == 0)
                shmctl(shmid, IPC_RMID, NULL);
}

int main(void)
{
        int shmid = shmget(IPC_PRIVATE, 32, IPC_CREAT | 0600);
        if (shmid == -1) {
                perror("shmget");
                exit(1);
        }

        pid_t pid = fork();
        if (pid == -1) {
                destroy_shm(shmid);
                perror("fork");
                exit(1);
        }

        if (pid == 0) {
                sleep(5);
                char *ptr = (char *)shmat(shmid, NULL, 0);
                strcpy(ptr, "rHello world!aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
                shmdt(ptr);
                exit(0);
        }

        char *ptr = (char *)shmat(shmid, NULL, 0);
        if (ptr) {
                while (1) {
                        if (*ptr == 'r') {
                                printf("%s\n", ptr+1);
                                break;
                        } else
                                usleep(1);
                }
        }
        shmdt(ptr);
        destroy_shm(shmid);
        exit(0);
}

编译结果:

$ gcc -o test shared.c
$ ./test
Hello world!aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2010-10-14 12:50 |只看该作者
程序不会检查你有没有超出32个字节,
但出了问题,你自己负责。

论坛徽章:
0
3 [报告]
发表于 2010-10-14 13:47 |只看该作者
回复 2# lenovo


    那该如何预防呢?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2010-10-14 14:25 |只看该作者
回复  lenovo


    那该如何预防呢?
aaron_xueli 发表于 2010-10-14 13:47



    写程序时,自己控制不要超过32字节。
就像你分配了内存,然后自己负责释放一样,
由你自己来保证。

论坛徽章:
0
5 [报告]
发表于 2010-10-14 14:43 |只看该作者

  1. #include <sys/types.h>
  2. #include <sys/shm.h>
  3. #include <sys/ipc.h>
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>

  7. #define TOKEN 'r'

  8. void destroy_shm(int shmid)
  9. {
  10.     struct shmid_ds buf;
  11.     shmctl(shmid, IPC_STAT, &buf);
  12.     if (buf.shm_nattch == 0)
  13.     shmctl(shmid, IPC_RMID, NULL);
  14. }

  15. int main(void)
  16. {
  17.     int shmid = shmget(IPC_PRIVATE, 32, IPC_CREAT | 0600);
  18.     if (shmid == -1)
  19.     {
  20.         perror("shmget");
  21.         exit(1);
  22.     }

  23.     pid_t pid = fork();
  24.     if (pid == -1)
  25.     {
  26.         destroy_shm(shmid);
  27.         perror("fork");
  28.         exit(1);
  29.     }

  30.     if (pid == 0)
  31.     {
  32.         sleep(5);
  33.         char *ptr = (char *)shmat(shmid, NULL, 0);
  34.         strcpy(ptr, "rHello world!aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
  35.         shmdt(ptr);
  36.         exit(0);
  37.     }

  38.     char *ptr = (char *)shmat(shmid, NULL, 0);
  39.     if (ptr)
  40.     {
  41.         while (1)
  42.         {
  43.             if (*ptr == 'r')
  44.             {
  45.                 printf("%s\n", ptr+1);
  46.                 break;
  47.             } else
  48.                 usleep(1);
  49.         }
  50.     }
  51.     shmdt(ptr);
  52.     destroy_shm(shmid);
  53.     exit(0);
  54. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2010-10-14 14:45 |只看该作者
这看着多整洁啊,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP