新手请教 共享内存 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
为什么地址不是一样的呢?请高手指导小弟下~