lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame^] | 1 | @node Inter-Process Communication, Job Control, Processes, Top |
| 2 | @c %MENU% All about inter-process communication |
| 3 | @chapter Inter-Process Communication |
| 4 | @cindex ipc |
| 5 | |
| 6 | This chapter describes the @glibcadj{} inter-process communication primitives. |
| 7 | |
| 8 | @menu |
| 9 | * Semaphores:: Support for creating and managing semaphores |
| 10 | @end menu |
| 11 | |
| 12 | @node Semaphores |
| 13 | @section Semaphores |
| 14 | |
| 15 | @Theglibc{} implements the semaphore APIs as defined in POSIX and |
| 16 | System V. Semaphores can be used by multiple processes to coordinate shared |
| 17 | resources. The following is a complete list of the semaphore functions provided |
| 18 | by @theglibc{}. |
| 19 | |
| 20 | @c Need descriptions for all of these functions. |
| 21 | |
| 22 | @subsection System V Semaphores |
| 23 | @deftypefun int semctl (int @var{semid}, int @var{semnum}, int @var{cmd}); |
| 24 | @safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{/linux}}} |
| 25 | @c syscall(ipc) ok |
| 26 | @c |
| 27 | @c AC-unsafe because we need to translate the new kernel |
| 28 | @c semid_ds buf into the userspace layout. Cancellation |
| 29 | @c at that point results in an inconsistent userspace |
| 30 | @c semid_ds. |
| 31 | @end deftypefun |
| 32 | |
| 33 | @deftypefun int semget (key_t @var{key}, int @var{nsems}, int @var{semflg}); |
| 34 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 35 | @c syscall(ipc) ok |
| 36 | @end deftypefun |
| 37 | |
| 38 | @deftypefun int semop (int @var{semid}, struct sembuf *@var{sops}, size_t @var{nsops}); |
| 39 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 40 | @c syscall(ipc) ok |
| 41 | @end deftypefun |
| 42 | |
| 43 | @deftypefun int semtimedop (int @var{semid}, struct sembuf *@var{sops}, size_t @var{nsops}, const struct timespec *@var{timeout}); |
| 44 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 45 | @c syscall(ipc) ok |
| 46 | @end deftypefun |
| 47 | |
| 48 | @subsection POSIX Semaphores |
| 49 | |
| 50 | @deftypefun int sem_init (sem_t *@var{sem}, int @var{pshared}, unsigned int @var{value}); |
| 51 | @safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}} |
| 52 | @c Does not atomically update sem_t therefore AC-unsafe |
| 53 | @c because it can leave sem_t partially initialized. |
| 54 | @end deftypefun |
| 55 | |
| 56 | @deftypefun int sem_destroy (sem_t *@var{sem}); |
| 57 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 58 | @c Function does nothing and is therefore always safe. |
| 59 | @end deftypefun |
| 60 | |
| 61 | @deftypefun sem_t *sem_open (const char *@var{name}, int @var{oflag}, ...); |
| 62 | @safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{}}@acunsafe{@acuinit{}}} |
| 63 | @c pthread_once asuinit |
| 64 | @c |
| 65 | @c We are AC-Unsafe becuase we use pthread_once to initialize |
| 66 | @c a global variable that holds the location of the mounted |
| 67 | @c shmfs on Linux. |
| 68 | @end deftypefun |
| 69 | |
| 70 | @deftypefun int sem_close (sem_t *@var{sem}); |
| 71 | @safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}} |
| 72 | @c lll_lock asulock aculock |
| 73 | @c twalk mtsrace{:root} |
| 74 | @c |
| 75 | @c We are AS-unsafe because we take a non-recursive lock. |
| 76 | @c We are AC-unsafe because several internal data structures |
| 77 | @c are not updated atomically. |
| 78 | @end deftypefun |
| 79 | |
| 80 | @deftypefun int sem_unlink (const char *@var{name}); |
| 81 | @safety{@prelim{}@mtsafe{}@asunsafe{@asuinit{}}@acunsafe{@acucorrupt{}}} |
| 82 | @c pthread_once asuinit acucorrupt aculock |
| 83 | @c mempcpy acucorrupt |
| 84 | @end deftypefun |
| 85 | |
| 86 | @deftypefun int sem_wait (sem_t *@var{sem}); |
| 87 | @safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}} |
| 88 | @c atomic_increment (nwaiters) acucorrupt |
| 89 | @c |
| 90 | @c Given the use atomic operations this function seems |
| 91 | @c to be AS-safe. It is AC-unsafe because there is still |
| 92 | @c a window between atomic_decrement and the pthread_push |
| 93 | @c of the handler that undoes that operation. A cancellation |
| 94 | @c at that point would fail to remove the process from the |
| 95 | @c waiters count. |
| 96 | @end deftypefun |
| 97 | |
| 98 | @deftypefun int sem_timedwait (sem_t *@var{sem}, const struct timespec *@var{abstime}); |
| 99 | @safety{@prelim{}@mtsafe{}@assafe{}@acunsafe{@acucorrupt{}}} |
| 100 | @c Same safety issues as sem_wait. |
| 101 | @end deftypefun |
| 102 | |
| 103 | @deftypefun int sem_trywait (sem_t *@var{sem}); |
| 104 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 105 | @c All atomic operations are safe in all contexts. |
| 106 | @end deftypefun |
| 107 | |
| 108 | @deftypefun int sem_post (sem_t *@var{sem}); |
| 109 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 110 | @c Same safety as sem_trywait. |
| 111 | @end deftypefun |
| 112 | |
| 113 | @deftypefun int sem_getvalue (sem_t *@var{sem}, int *@var{sval}); |
| 114 | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 115 | @c Atomic write of a value is safe in all contexts. |
| 116 | @end deftypefun |