主题 : 新手请教 共享内存 shmid 相同 shmat 地址不同 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 12986
精华: 0
发帖: 19
金钱: 95 两
威望: 19 点
综合积分: 38 分
注册时间: 2010-01-16
最后登录: 2010-12-14
楼主  发表于: 2010-02-12 12:07

 新手请教 共享内存 shmid 相同 shmat 地址不同

新手请教 共享内存 shmid 相同 shmat 地址不同
源代码:1
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "semphore.h"

#define TEXT_SZ 2048
struct shared_use_st
{  
int written_by_you;
char some_text[TEXT_SZ];
};

static int sem_id;
int main()
{  
int running=1;
void *shared_memory=(void *)0;
struct shared_use_st *shared_stuff;
int shmid;
sem_id =semget(((key_t) 5654),1,0666|IPC_CREAT);
set_semvalue();
//srand((unsigned int)getpid());
shmid =shmget((key_t)1477,sizeof(struct shared_use_st),0777|IPC_CREAT);
printf("%d\n",shmid);
if(shmid==-1){
fprintf(stderr,"shmget ERRO!");
return 0;
}
shared_memory=shmat(shmid,NULL,0);
if(shared_memory==(void *)-1)
{  
fprintf(stderr,"shmat ERRO");
return 0;
}

printf("memory attached at %X \n",(int) shared_memory);
shared_stuff=(struct shared_use_st *)shared_memory;
shared_stuff->written_by_you=0;
while(running)
{  
if(shared_stuff->written_by_you)
{  
semaphore_p();
printf("You wrote %s",shared_stuff->some_text);
if(strncmp(shared_stuff->some_text,"end",3)==0)
          {  running=0;
        }
shared_stuff->written_by_you=0;        
semaphore_v();
}

}
if(shmdt(shared_memory)==-1){
fprintf(stderr," shmdt ERRO!");
exit(EXIT_FAILURE);
}

if(shmctl(shmid,IPC_RMID,0)==-1){
fprintf(stderr,"shmctl ERRO");
exit(EXIT_FAILURE);
}
del_semvalue();
return 1;
}

源代码2:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "semphore.h"

#define TEXT_SZ 2048
struct shared_use_st
{  
int written_by_you;
char some_text[TEXT_SZ];
};

static int sem_id;


int
main (int argc, char *argv[])
{  
        int running=1;
        void *shared_memory=(void *)0;
        struct shared_use_st *shared_stuff;
        char buffer[BUFSIZ];
        int shmid;
        sem_id =semget(((key_t) 5654),1,0666|IPC_CREAT);
        shmid =shmget((key_t)1477,sizeof(struct shared_use_st),0777|IPC_CREAT);
        printf("%d\n",shmid);
        if(shmid==-1){
        fprintf(stderr,"shmget2 ERRO!");
        exit(EXIT_FAILURE);
        }
        shared_memory=shmat(shmid,NULL,0);
        if((shared_memory==(void *)-1))
        {
                fprintf(stderr,"shmat2 ERRO!");
                exit(EXIT_FAILURE);
        }  
        printf("memory attached at %X \n",(int) shared_memory);
        shared_stuff=(struct shared_use_st *)shared_memory;
        
        while (running)
        {  
                semaphore_p();
                scanf("%s",shared_stuff->some_text);
                shared_stuff->written_by_you=1;
                semaphore_v();
                if (strncmp(buffer,"end",3)==0)
                {  
                        running=0;
                }
        }  

        if(shmdt(shared_memory)==-1){
        fprintf(stderr,"shmdt2 ERRO!");
        exit(EXIT_FAILURE);
        }
        return 1;
}  

编译执行
gcc -o sharememory2 sharememory2.c
gcc -o sharememory sharememory.c
./sharememory &
sleep 1
./sharememory2

得到结果:
622605
memory attached at B8090000
622605
memory attached at B80B0000
为什么地址不是一样的呢?请高手指导小弟下~  
级别: 新手上路
UID: 66696
精华: 0
发帖: 5
金钱: 30 两
威望: 6 点
综合积分: 10 分
注册时间: 2012-04-01
最后登录: 2012-05-31
1楼  发表于: 2012-04-24 14:38

 回 楼主(lw125849842) 的帖子

映射的地址到进程的地址是不一样的。。。