I just read the manpages for shm_open
and shmat
and was trying out the following example. In a file test.c
I do,
int main(int argc, char **argv) {
void *retval;
long shmid = atol(argv[1]);
retval = shmat(shmid, NULL, SHM_RDONLY);
printf("%pn", retval);
}
And in a wrapper file I do,
int setupshm(char *name) {
int shmid;
shmid = shm_open(name, O_CREAT|O_RDWR, 0666);
return shmid;
}
int main() {
char **envp = NULL;
char *argv[3];
char num[10];
sprintf(num, "%d", setupshm("whatever"));
argv[1] = "./test";
argv[2] = num;
argv[3] = NULL;
execve("./test", argv, envp);
}
I tried adding in a strerror(errno)
at test.c and I get Identifier removed
. What does that mean? What am I doing wrong? Given a shared memory identifier(shmid), shouldn’t I be able to access the shared memory from any process?
Advertisement
Answer
shm_open
belongs to the POSIX shared memory API; shmat
belongs to the older SysV shared memory API. POSIX shm uses file descriptors. SysV shm uses identifiers that exist in a separate space. They don’t work together.
To use SysV shm successfully, you must use shmget
to get an identifier you can shmat
.
To use POSIX shm successfully, you must mmap
the file descriptor you got from shm_open
.