errno = EINVAL;
return SEM_FAILED;
}
- sem_init(&newsem, 0, value);
+ sem_init(&newsem, 1, value);
clock_gettime(CLOCK_REALTIME, &ts);
snprintf(tmp, sizeof(tmp), "/dev/shm/%p-%p-%d-%d",
&name, name, (int)getpid(), (int)ts.tv_nsec);
- tfd = open(tmp, O_CREAT|O_EXCL|O_RDWR, mode);
+ tfd = open(tmp, O_CREAT|O_EXCL|O_RDWR|O_CLOEXEC, mode);
if (tfd<0) return SEM_FAILED;
- dir = open("/dev/shm", O_DIRECTORY|O_RDONLY);
+ dir = open("/dev/shm", O_DIRECTORY|O_RDONLY|O_CLOEXEC);
if (dir<0 || write(tfd,&newsem,sizeof newsem)!=sizeof newsem) {
if (dir >= 0) close(dir);
close(tfd);
for (;;) {
if (!(flags & O_EXCL)) {
- fd = shm_open(name, flags&~O_CREAT, mode);
+ fd = shm_open(name, flags&~O_CREAT, 0);
if (fd >= 0 || errno != ENOENT) {
if (flags & O_CREAT) {
close(dir);