//my_pxsem_mmap/sem_open.c
exists:
	if ( (fd = open(pathname, O_RDWR)) < 0) {
		if (errno == ENOENT && (oflag & O_CREAT))
			goto again;
		goto err;
	}

	sem = mmap(NULL, sizeof(mysem_t), PROT_READ | PROT_WRITE,
			   MAP_SHARED, fd, 0);
	if (sem == MAP_FAILED)
		goto err;

		/* ,    */
	for (i = 0; i < MAX_TRIES; i++) {
		if (stat(pathname, &statbuff) == -1) {
			if (errno == ENOENT && (oflag & O_CREAT)) {
				close(fd);
				goto again;
			}
			goto err;
		}
		if ((statbuff.st_mode & S_IXUSR) == 0) {
			close(fd);
			sem->sem_magic = SEM_MAGIC;
			return(sem);
		}
		sleep(1);
	}
	errno = ETIMEDOUT;
	goto err;

pthreaderr:
	errno = i;
err:
		/*    unlink  munmap   errno */
	save_errno = errno;
	if (created)
		unlink(pathname);
	if (sem != MAP_FAILED)
		munmap(sem, sizeof(mysem_t));
	close(fd);
	errno = save_errno;
	return(SEM_FAILED);
}
