#include #include #include #include #include #include int main() { pthread_mutexattr_t ma; pthread_mutex_t *m; void *ptr; pid_t pid, wpid; int status; int ret; ptr = mmap(NULL, sizeof(pthread_mutex_t), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1 /* fd */, 0); if (ptr == MAP_FAILED) { perror("mmap"); return (1); } pthread_mutexattr_init(&ma); pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_ERRORCHECK); pthread_mutexattr_setpshared(&ma, PTHREAD_PROCESS_SHARED); pthread_mutexattr_setrobust(&ma, PTHREAD_MUTEX_ROBUST); ret = pthread_mutex_init(ptr, &ma); if (ret != 0) { perror("pthread_mutex_init"); return (1); } m = ptr; pid = fork(); if (pid == 0) { pthread_mutex_lock(m); _exit(0); } if (pid == -1) { perror("fork"); return (1); } wpid = waitpid(pid, &status, 0); if (wpid != pid) { perror("waitpid"); return (1); } pthread_mutex_destroy(m); pthread_mutexattr_destroy(&ma); munmap(ptr, sizeof(pthread_mutex_t)); return (0); }