shmat() ... is it a bug?
Hi -
Below ,I have 2 small programs which shows a problem in shmat() when the
executable linked with the curses library(libncurses). Has anybody seen something like this?
a.c --> allocates a shared memory segment and attaches.b.c --> attaching the allocated shared memory segment using the address from a.c
thanks,
Umut
a.c:
-----
#include <stdio.h>
#include <sys/types.h>
#include <sys/shm.h>
main()
{
unsigned int segsize = 512*1024;
int shmid;key_t shmkey = 123456789;
void * adr;
shmid = shmget(shmkey, segsize,IPC_CREAT|0660); adr = shmat(shmid, 0,0);
printf("shmid = %d adr = %p\n",shmid, adr);
}
b.c:
-----
#include <stdio.h>
#include <stdlib.h>
#include<sys/types.h>
#include <sys/shm.h>
main(int argc, char **argv)
{
void * addr1, * addr2;key_t shmkey = 123456789;
int shmid;
addr1 = (void*) strtoul(argv[1],NULL,0);
shmid = shmget(shmkey, 0, 0660);
addr2 = shmat(shmid, addr1, 0);printf("addr2 = %p\n",addr2);
}
%gcc3 -o a a.c
%gcc3 -o b b.c
%gcc3 -o c b.c -lncurses
% ./a
shmid = 313556996 adr = 0x2000000000300000
%./b 0x2000000000300000
addr2 = 0x2000000000300000
%./c 0x2000000000300000
addr2 = 0xffffffffffffffff
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line · Umut Aymakoglu
Umut> Below ,I have 2 small programs which shows a problem in Umut> shmat() when the executable linked with the curses Umut> library(libncurses). Has anybody seen something like this?
Umut> a.c --> allocates a shared memory segment and attaches. Umut> b.c --> attaching the allocated shared memory segment using the address Umut> from a.c
The bug is in the program: you can't assume that a fixed virtual address is available for mapping. When you link against -lncurses, it happens to get loaded at the same address as "a" mapped the shared memory segment. Obviously, you can't have the shared memory segment and libncurses mapped at the same address, hence the failure.
--david