免费注册 查看新帖 |

Chinaunix

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

[C] 无法获取共享内存中的内容? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-31 16:33 |只看该作者 |倒序浏览
本帖最后由 yetaowho 于 2012-07-31 16:39 编辑

代码如下:
---------------------------------------------
testread.c
int main()
{
     shmread();
     return 0;
}

testwrite.c
int main()
{
     shmwrite();
      return 0;
}
--------------------------------------------------------
shmread.c
int shmread()
{
    int running = 1;
        void *shared_memory = (void *)0;
    struct shared_use_at *shared_stuff;
    int shmid;
    srand((unsigned int) getpid());
    shmid = shmget((key_t)1234, sizeof(struct shared_use_at), 0766|IPC_CREAT);
    if(shmid == -1)
    {
        fprintf(stderr, "shmget failed\n");
        exit(EXIT_FAILURE);
    }
   
        shared_memory = shmat(shmid, (void *)0, 0);
        if(shared_memory == (void *)-1)
    {
        fprintf(stderr, "shmat failed\n");
        exit(EXIT_FAILURE);
    }

    shared_stuff = (struct shared_use_at *)shared_memory;
   
        shared_stuff->written_by_you = 0;
   
        while(running)
    {
                if(shared_stuff->written_by_you==1)
        {
            printf("You wrote: %s", shared_stuff->some_text);
            shared_stuff->written_by_you = 0;
            if(strncmp(shared_stuff->some_text, "end", 3)==0)
            {
                running = 0;
            }
        }
    }
       
    if(shmdt(shared_memory)==-1)
    {
        fprintf(stderr, "shmdt failed\n");
        exit(EXIT_FAILURE);
    }

    if(shmctl(shmid, IPC_RMID, 0)==-1)
    {
        fprintf(stderr, "shmctl(IPC_RMID) failed\n");
        exit(EXIT_FAILURE);
    }

    exit(EXIT_SUCCESS);
}
---------------------------------------------------------
shmwrite.c
int shmwrite()
{
        int running = 1;
        void *shared_memory = (void *)0;
        struct shared_use_at *shared_stuff;
        char buffer[256];
        int shmid;
    shmid = shmget((key_t)1234, sizeof(struct shared_use_at), 0766 | IPC_CREAT);
    if(shmid == -1)
    {
                fprintf(stderr, "shmget failed\n");
                exit(EXIT_FAILURE);
    }
    shared_memory = shmat(shmid, (void *)0, 0);
    if(shared_memory == (void *)-1)
    {
        fprintf(stderr, "shmat failed\n");
        exit(EXIT_FAILURE);
    }
   
        shared_stuff = (struct shared_use_at *)shared_memory;
       
    while(running)
    {               
                printf("Enter some text: ");
                fgets(buffer, 256, stdin);
                strncpy(shared_stuff->some_text, buffer, TEXT_SZ);
                shared_stuff->written_by_you = 1;
                if(strncmp(buffer, "end", 3) == 0)
                {
                                running = 0;
                }               
    }
       
    if(shmdt(shared_memory) == -1)
    {
        fprintf(stderr, "shmdt failed\n");
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}
-----------------------------------------
shmread.c shmwrite.c的头文件:

struct shared_use_at
{
    int written_by_you;
    char some_text[TEXT_SZ];
};

int shmread();
int shmwrite();
------------------------------
编译后,先执行testwrite,后执行testread。在 testwrite输入:helloworld后,testread无法读取到共享内存字符, 但是把shmread.c shmwrite.c 中的函数名改成main后,shmread是可以获取到共享内存内容的,请问各位高手、大牛这是怎么回事?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2012-07-31 16:56 |只看该作者
改成main?那不是两main了,肯定是你make有问题

论坛徽章:
0
3 [报告]
发表于 2012-07-31 17:09 |只看该作者
回复 2# hellioncu
确实是2个main. 就是将shmread.c shmwrite.c分别编译可执行文件,shmread可以获取到共享内存内容,makefile如下:
CFLAGS = -g -O2 -Wall -I../db -I../public -I../dbin
LDFLAGS = -lpublic -lcredis -lredisin -L../public -L../db -L../dbin

# targets to build with 'make all'
TARGETS = zread zwrite

all: $(TARGETS)

zread: testread.o shmread.o
        $(CC) $(CFLAGS) $(LDFLAGS) $(CPPFLAGS) -o $@ $^

zwrite: testwrite.o shmwrite.o
        $(CC) $(CFLAGS) $(LDFLAGS) $(CPPFLAGS) -o $@ $^
       
testread.o: testread.c
        $(CC) -c -fPIC $(CFLAGS) $(CPPFLAGS) -o $@ testread.c

shmread.o: shmread.c
        $(CC) -c -fPIC $(CFLAGS) $(CPPFLAGS) -o $@ shmread.c
       
testwrite.o: testwrite.c
        $(CC) -c -fPIC $(CFLAGS) $(CPPFLAGS) -o $@ testwrite.c

shmwrite.o: shmwrite.c
        $(CC) -c -fPIC $(CFLAGS) $(CPPFLAGS) -o $@ shmwrite.c
   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2012-07-31 17:28 |只看该作者
yetaowho 发表于 2012-07-31 17:09
回复 2# hellioncu
确实是2个main. 就是将shmread.c shmwrite.c分别编译可执行文件,shmread可以获取到共 ...


不改函数名,testread.c、testwrite.c也没有make进去,shmread.c shmwrite.c都没有main函数,能执行个什么呢

论坛徽章:
0
5 [报告]
发表于 2012-07-31 17:44 |只看该作者
回复 4# hellioncu
我是这样改的:
-------------------------
shmread.c
int main()
{
    int running = 1;
        void *shared_memory = (void *)0;
    struct shared_use_at *shared_stuff;
    int shmid;
    srand((unsigned int) getpid());
    shmid = shmget((key_t)1234, sizeof(struct shared_use_at), 0766|IPC_CREAT);
    if(shmid == -1)
    {
        fprintf(stderr, "shmget failed\n");
        exit(EXIT_FAILURE);
    }
   
        shared_memory = shmat(shmid, (void *)0, 0);
        if(shared_memory == (void *)-1)
    {
        fprintf(stderr, "shmat failed\n");
        exit(EXIT_FAILURE);
    }

    shared_stuff = (struct shared_use_at *)shared_memory;
   
        shared_stuff->written_by_you = 0;
   
        while(running)
    {
                if(shared_stuff->written_by_you==1)
                {
            printf("You wrote: %s", shared_stuff->some_text);
            shared_stuff->written_by_you = 0;
            if(strncmp(shared_stuff->some_text, "end", 3)==0)
            {
                running = 0;
            }
        }
    }
       
    if(shmdt(shared_memory)==-1)
    {
        fprintf(stderr, "shmdt failed\n");
        exit(EXIT_FAILURE);
    }

    if(shmctl(shmid, IPC_RMID, 0)==-1)
    {
        fprintf(stderr, "shmctl(IPC_RMID) failed\n");
        exit(EXIT_FAILURE);
    }

    exit(EXIT_SUCCESS);
}
-------------------------
shmwrite.c
int main()
{
        int running = 1;
        void *shared_memory = (void *)0;
        struct shared_use_at *shared_stuff;
        char buffer[256];
        int shmid;
    shmid = shmget((key_t)1234, sizeof(struct shared_use_at), 0766 | IPC_CREAT);
    if(shmid == -1)
    {
                fprintf(stderr, "shmget failed\n");
                exit(EXIT_FAILURE);
    }
    shared_memory = shmat(shmid, (void *)0, 0);
    if(shared_memory == (void *)-1)
    {
        fprintf(stderr, "shmat failed\n");
        exit(EXIT_FAILURE);
    }
   
        shared_stuff = (struct shared_use_at *)shared_memory;
       
    while(running)
    {
                printf("Enter some text: ");
                fgets(buffer, 256, stdin);
                strncpy(shared_stuff->some_text, buffer, TEXT_SZ);
                shared_stuff->written_by_you = 1;
                if(strncmp(buffer, "end", 3) == 0)
                {
                        running = 0;
                }
    }
       
    if(shmdt(shared_memory) == -1)
    {
        fprintf(stderr, "shmdt failed\n");
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}
修改后:gcc shmread.c -o shmread
          gcc shmwrite.c -o shmwrite
编译后执行,shmread可以获取共享内存的内容,而按照testread.c testwrite.c 调用shmread.c,shmwrite.c,shmread.c中的main函数名改为了shmread(), shmwrite.c中的main函数改为了shmwrite()这种方式,在执行makefile ,编译后,执行,zread可执行文件不能获取到共享内存内容?

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP