nisc
nisc

Reputation: 4400

POSIX shared memory + directories

The OS I'm working on (IBM CNK, which is not Linux, but somewhat POSIX-compliant) doesn't allow me to simply create a new file or directory in /dev/shm using fopen() or mkdir(), respectively. It looks like I have to use shm_open() to get a file descriptor and then fdopen() to use the shared region for file I/O.

Upvotes: 2

Views: 3540

Answers (2)

ephemient
ephemient

Reputation: 204718

I've never heard of IBM CNK before… but let's make some generalizations from POSIX/SUS.

It's not portable to mmap beyond the end of a file. You should call ftruncate to set the end of the file before mapping it.

The presence of /dev/shm is purely an implementation detail of shm_open. It would be POSIX-compliant to have no /dev/shm and implement shm_open in some other way. On Linux, /dev/shm happens to be a normal (though memory-backed) filesystem, but you can't portably expect /dev/shm to act filesystem-like, or even exist.

Upvotes: 1

DarkDust
DarkDust

Reputation: 92335

Does your OS provide a full-featured mmap ? Do you only need the shared memory area in relatives, i.e. processes that you forked off ? If those two conditions are met you don't need any files at all, just use mmap:

char *shm_area;
shm_area = mmap(NULL, mySHMsize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0);

if (fork() == 0) {
  // Child, can access shm_area.
} else {
  // Parent, can access shm_area.
}

Upvotes: 0

Related Questions