Blame manual/ipc.texi

Packit 6c4009
@node Inter-Process Communication, Job Control, Processes, Top
Packit 6c4009
@c %MENU% All about inter-process communication
Packit 6c4009
@chapter Inter-Process Communication
Packit 6c4009
@cindex ipc
Packit 6c4009
Packit 6c4009
This chapter describes the @glibcadj{} inter-process communication primitives.
Packit 6c4009
Packit 6c4009
@menu
Packit 6c4009
* Semaphores::	Support for creating and managing semaphores
Packit 6c4009
@end menu
Packit 6c4009
Packit 6c4009
@node Semaphores
Packit 6c4009
@section Semaphores
Packit 6c4009
Packit 6c4009
@Theglibc{} implements the semaphore APIs as defined in POSIX and
Packit 6c4009
System V.  Semaphores can be used by multiple processes to coordinate shared
Packit 6c4009
resources.  The following is a complete list of the semaphore functions provided
Packit 6c4009
by @theglibc{}.
Packit 6c4009
Packit 6c4009
@c Need descriptions for all of these functions.
Packit 6c4009
Packit 6c4009
@subsection System V Semaphores
Packit 6c4009
@deftypefun int semctl (int @var{semid}, int @var{semnum}, int @var{cmd});
Packit 6c4009
@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{/linux}}}
Packit 6c4009
@c syscall(ipc) ok
Packit 6c4009
@c
Packit 6c4009
@c AC-unsafe because we need to translate the new kernel
Packit 6c4009
@c semid_ds buf into the userspace layout.  Cancellation
Packit 6c4009
@c at that point results in an inconsistent userspace
Packit 6c4009
@c semid_ds.
Packit 6c4009
@end deftypefun
Packit 6c4009
Packit 6c4009
@deftypefun int semget (key_t @var{key}, int @var{nsems}, int @var{semflg});
Packit 6c4009
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
Packit 6c4009
@c syscall(ipc) ok
Packit 6c4009
@end deftypefun
Packit 6c4009
Packit 6c4009
@deftypefun int semop (int @var{semid}, struct sembuf *@var{sops}, size_t @var{nsops});
Packit 6c4009
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
Packit 6c4009
@c syscall(ipc) ok
Packit 6c4009
@end deftypefun
Packit 6c4009
Packit 6c4009
@deftypefun int semtimedop (int @var{semid}, struct sembuf *@var{sops}, size_t @var{nsops}, const struct timespec *@var{timeout});
Packit 6c4009
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
Packit 6c4009
@c syscall(ipc) ok
Packit 6c4009
@end deftypefun
Packit 6c4009
Packit 6c4009
@subsection POSIX Semaphores
Packit 6c4009
Packit 6c4009
@deftypefun int sem_init (sem_t *@var{sem}, int @var{pshared}, unsigned int @var{value});
Packit 6c4009
@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}}
Packit 6c4009
@c Does not atomically update sem_t therefore AC-unsafe
Packit 6c4009
@c because it can leave sem_t partially initialized.
Packit 6c4009
@end deftypefun
Packit 6c4009
Packit 6c4009
@deftypefun int sem_destroy (sem_t *@var{sem});
Packit 6c4009
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
Packit 6c4009
@c Function does nothing and is therefore always safe.
Packit 6c4009
@end deftypefun
Packit 6c4009
Packit 6c4009
@deftypefun sem_t *sem_open (const char *@var{name}, int @var{oflag}, ...);
Packit 6c4009
@safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{}}@acunsafe{@acuinit{}}}
Packit 6c4009
@c pthread_once asuinit
Packit 6c4009
@c
Packit 6c4009
@c We are AC-Unsafe becuase we use pthread_once to initialize
Packit 6c4009
@c a global variable that holds the location of the mounted
Packit 6c4009
@c shmfs on Linux.
Packit 6c4009
@end deftypefun
Packit 6c4009
Packit 6c4009
@deftypefun int sem_close (sem_t *@var{sem});
Packit 6c4009
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
Packit 6c4009
@c lll_lock asulock aculock
Packit 6c4009
@c twalk mtsrace{:root}
Packit 6c4009
@c
Packit 6c4009
@c We are AS-unsafe because we take a non-recursive lock.
Packit 6c4009
@c We are AC-unsafe because several internal data structures
Packit 6c4009
@c are not updated atomically.
Packit 6c4009
@end deftypefun
Packit 6c4009
Packit 6c4009
@deftypefun int sem_unlink (const char *@var{name});
Packit 6c4009
@safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{}}@acunsafe{@acucorrupt{}}}
Packit 6c4009
@c pthread_once asuinit acucorrupt aculock
Packit 6c4009
@c mempcpy acucorrupt
Packit 6c4009
@end deftypefun
Packit 6c4009
Packit 6c4009
@deftypefun int sem_wait (sem_t *@var{sem});
Packit 6c4009
@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}}
Packit 6c4009
@c atomic_increment (nwaiters) acucorrupt
Packit 6c4009
@c
Packit 6c4009
@c Given the use atomic operations this function seems
Packit 6c4009
@c to be AS-safe.  It is AC-unsafe because there is still
Packit 6c4009
@c a window between atomic_decrement and the pthread_push
Packit 6c4009
@c of the handler that undoes that operation.  A cancellation
Packit 6c4009
@c at that point would fail to remove the process from the
Packit 6c4009
@c waiters count.
Packit 6c4009
@end deftypefun
Packit 6c4009
Packit 6c4009
@deftypefun int sem_timedwait (sem_t *@var{sem}, const struct timespec *@var{abstime});
Packit 6c4009
@safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}}
Packit 6c4009
@c Same safety issues as sem_wait.
Packit 6c4009
@end deftypefun
Packit 6c4009
Packit 6c4009
@deftypefun int sem_trywait (sem_t *@var{sem});
Packit 6c4009
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
Packit 6c4009
@c All atomic operations are safe in all contexts.
Packit 6c4009
@end deftypefun
Packit 6c4009
Packit 6c4009
@deftypefun int sem_post (sem_t *@var{sem});
Packit 6c4009
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
Packit 6c4009
@c Same safety as sem_trywait.
Packit 6c4009
@end deftypefun
Packit 6c4009
Packit 6c4009
@deftypefun int sem_getvalue (sem_t *@var{sem}, int *@var{sval});
Packit 6c4009
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
Packit 6c4009
@c Atomic write of a value is safe in all contexts.
Packit 6c4009
@end deftypefun