Ignoring some details there are two low-level SHM APIs available for in Linux.
We have the older (e.g System V IPC vs POSIX IPC) SysV interface using:
and the newer Posix interface (though Posix seems to standardize the SysV one as well):
When using shm_open() there appears to be a clear 1 to 1 mapping between files and shared memory segments. However if you use shmget() you can relate multiple segments to a single path using, for example:
key1=ftok(path,1);
key2=ftok(path,2);
shmget(key1,...)
shmget(key2,...)
What if anything the relationship between files and segments in this case? The path given to ftok is just a placeholder. I can't see what purpose it serves. If we consider the Unix philosophy as everything is a file why is this not a one to one mapping?
Separate but related question:
There is no such suggestion in shm_open or shm_get
I can find only vague suggestions like:
I think the SysV is considered less thread-safe.
Is there any reason why you might prefer the SysV one (or the posix one) in a modern application?
The path given to ftok is just a placeholder in the "everything is a file" tradition.
After some time considering I would say mmap is a simpler, safer and more effective API. I personally would avoid shmget etc. completely if possible.
It is particularly awkward to clean up after shmget() see:
See also:
An argument used in favour of system-v in one of the linked questions is that Posix was less widely implemented. I don't know if that was true then but it seems even less likely to be true now. Given the dominance of GNU/Linux & BSD derivatives. Even the legendarily 'unique' AIX claims Posix compliance these days.