Posix shared memory initialization
Since you use the O_EXCL
flag I will assume that you have a set of processes gathered around one master (the creator of the segment).
Then, your master process will create the shared memory segment using a call to shm_open
:
shmid = shm_open("/insert/name/here", O_CREAT|O_EXCL, 0644);if (-1 == shmid) { printf("Oops ..\n");}
Here, the slaves are ready to use the segment. Since the master HAS to create the segment, there is no need to use the O_CREAT
flag in the slaves calls. You'll just have to handle possible errors if the slave call is performed when the segment is not created yet or already destroyed.
When any of your processes is done with the segment, it should call shm_unlink()
. In this kind of architecture, the master is usually feeding the slaves. When it has nothing more to say, it just shuts up. The slaves have then the responsibility to handle corresponding errors gracefully.
As you stated, if a process dies before calling the shm_unlink
procedure, then the segment will continue to live thereafter. To avoid this in some cases, you could define your own signal handlers in order to perform the operation when signals such as SIGINT
are received. Anyway, you won't be able to cover the mess in case SIGKILL
is sent to your process.
EDIT :To be more specific, the use of O_CREAT | O_EXCL
is wrong when unnecessary. With the little example above, you can see that it is required for the master to create the segment, thus those flags are needed. On the other hand, none of the slave processes would have to ever create it. Thus, you will absolutely forbid the use of O_CREAT
in the related calls.
Now, if another process calls shm_open(..., O_CREAT, ...)
when the segment is already created, it will just retrieve a file descriptor related to this very segment. It will thus be on the right channel (if it has the rights to do so, see the mode
argument)
You can do the following :int test = shmget(key_t key,size,0); Put this at the star of each process. Zero flag here tries to open an existing shared memory if its not created yet test will equal -1 so you can make a check after this statement if test -1 go and creat a shared memory else you just got an id to an existing shared memory ..... I hope this help