1 # SOME DESCRIPTIVE TITLE
2 # Copyright (C) YEAR Free Software Foundation, Inc.
3 # This file is distributed under the same license as the PACKAGE package.
4 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
9 "Project-Id-Version: PACKAGE VERSION\n"
10 "POT-Creation-Date: 2013-03-26 16:48+0900\n"
11 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13 "Language-Team: LANGUAGE <LL@li.org>\n"
16 "Content-Type: text/plain; charset=CHARSET\n"
17 "Content-Transfer-Encoding: 8bit\n"
20 #: build/C/man3/sem_close.3:26
26 #: build/C/man3/sem_close.3:26 build/C/man3/sem_destroy.3:26 build/C/man3/sem_getvalue.3:26 build/C/man3/sem_init.3:26 build/C/man3/sem_open.3:26 build/C/man7/sem_overview.7:26 build/C/man3/sem_post.3:26 build/C/man3/sem_unlink.3:26 build/C/man3/sem_wait.3:26
32 #: build/C/man3/sem_close.3:26 build/C/man3/sem_destroy.3:26 build/C/man3/sem_getvalue.3:26 build/C/man3/sem_init.3:26 build/C/man3/sem_open.3:26 build/C/man7/sem_overview.7:26 build/C/man3/sem_post.3:26 build/C/man3/sem_unlink.3:26 build/C/man3/sem_wait.3:26 build/C/man2/semctl.2:41 build/C/man2/semget.2:36 build/C/man2/semop.2:35
38 #: build/C/man3/sem_close.3:26 build/C/man3/sem_destroy.3:26 build/C/man3/sem_getvalue.3:26 build/C/man3/sem_init.3:26 build/C/man3/sem_open.3:26 build/C/man7/sem_overview.7:26 build/C/man3/sem_post.3:26 build/C/man3/sem_unlink.3:26 build/C/man3/sem_wait.3:26 build/C/man2/semctl.2:41 build/C/man2/semget.2:36 build/C/man2/semop.2:35
40 msgid "Linux Programmer's Manual"
44 #: build/C/man3/sem_close.3:27 build/C/man3/sem_destroy.3:27 build/C/man3/sem_getvalue.3:27 build/C/man3/sem_init.3:27 build/C/man3/sem_open.3:27 build/C/man7/sem_overview.7:27 build/C/man3/sem_post.3:27 build/C/man3/sem_unlink.3:27 build/C/man3/sem_wait.3:27 build/C/man2/semctl.2:42 build/C/man2/semget.2:37 build/C/man2/semop.2:36
50 #: build/C/man3/sem_close.3:29
51 msgid "sem_close - close a named semaphore"
55 #: build/C/man3/sem_close.3:29 build/C/man3/sem_destroy.3:29 build/C/man3/sem_getvalue.3:29 build/C/man3/sem_init.3:29 build/C/man3/sem_open.3:29 build/C/man3/sem_post.3:29 build/C/man3/sem_unlink.3:29 build/C/man3/sem_wait.3:29 build/C/man2/semctl.2:44 build/C/man2/semget.2:39 build/C/man2/semop.2:38
61 #: build/C/man3/sem_close.3:32 build/C/man3/sem_destroy.3:32 build/C/man3/sem_getvalue.3:32 build/C/man3/sem_init.3:32 build/C/man3/sem_post.3:32 build/C/man3/sem_unlink.3:32 build/C/man3/sem_wait.3:32
63 msgid "B<#include E<lt>semaphore.hE<gt>>\n"
67 #: build/C/man3/sem_close.3:34
69 msgid "B<int sem_close(sem_t *>I<sem>B<);>\n"
73 #: build/C/man3/sem_close.3:37 build/C/man3/sem_destroy.3:37 build/C/man3/sem_getvalue.3:37 build/C/man3/sem_init.3:37 build/C/man3/sem_open.3:41 build/C/man3/sem_post.3:37 build/C/man3/sem_unlink.3:37 build/C/man3/sem_wait.3:41
74 msgid "Link with I<-pthread>."
78 #: build/C/man3/sem_close.3:37 build/C/man3/sem_destroy.3:37 build/C/man3/sem_getvalue.3:37 build/C/man3/sem_init.3:37 build/C/man3/sem_open.3:41 build/C/man7/sem_overview.7:29 build/C/man3/sem_post.3:37 build/C/man3/sem_unlink.3:37 build/C/man3/sem_wait.3:49 build/C/man2/semctl.2:52 build/C/man2/semget.2:49 build/C/man2/semop.2:57
84 #: build/C/man3/sem_close.3:43
86 "B<sem_close>() closes the named semaphore referred to by I<sem>, allowing "
87 "any resources that the system has allocated to the calling process for this "
88 "semaphore to be freed."
92 #: build/C/man3/sem_close.3:43 build/C/man3/sem_destroy.3:55 build/C/man3/sem_getvalue.3:54 build/C/man3/sem_init.3:77 build/C/man3/sem_open.3:104 build/C/man3/sem_post.3:45 build/C/man3/sem_unlink.3:44 build/C/man3/sem_wait.3:108 build/C/man2/semctl.2:340 build/C/man2/semget.2:157 build/C/man2/semop.2:314
98 #: build/C/man3/sem_close.3:49
100 "On success B<sem_close>() returns 0; on error, -1 is returned, with "
101 "I<errno> set to indicate the error."
105 #: build/C/man3/sem_close.3:49 build/C/man3/sem_destroy.3:61 build/C/man3/sem_getvalue.3:60 build/C/man3/sem_init.3:83 build/C/man3/sem_open.3:116 build/C/man3/sem_post.3:52 build/C/man3/sem_unlink.3:50 build/C/man3/sem_wait.3:114 build/C/man2/semctl.2:387 build/C/man2/semget.2:163 build/C/man2/semop.2:324
111 #: build/C/man3/sem_close.3:50 build/C/man3/sem_destroy.3:62 build/C/man3/sem_getvalue.3:61 build/C/man3/sem_init.3:84 build/C/man3/sem_open.3:132 build/C/man3/sem_open.3:137 build/C/man3/sem_post.3:53 build/C/man3/sem_wait.3:119 build/C/man3/sem_wait.3:133 build/C/man2/semctl.2:420 build/C/man2/semget.2:188 build/C/man2/semop.2:372
117 #: build/C/man3/sem_close.3:54 build/C/man3/sem_destroy.3:66 build/C/man3/sem_getvalue.3:65 build/C/man3/sem_post.3:57 build/C/man3/sem_wait.3:123
118 msgid "I<sem> is not a valid semaphore."
122 #: build/C/man3/sem_close.3:54 build/C/man3/sem_destroy.3:66 build/C/man3/sem_getvalue.3:65 build/C/man3/sem_init.3:95 build/C/man3/sem_open.3:170 build/C/man7/sem_overview.7:138 build/C/man3/sem_post.3:61 build/C/man3/sem_unlink.3:62 build/C/man3/sem_wait.3:143 build/C/man2/semctl.2:462 build/C/man2/semget.2:219 build/C/man2/semop.2:402
124 msgid "CONFORMING TO"
128 #: build/C/man3/sem_close.3:56 build/C/man3/sem_destroy.3:68 build/C/man3/sem_getvalue.3:67 build/C/man3/sem_init.3:97 build/C/man3/sem_open.3:172 build/C/man7/sem_overview.7:140 build/C/man3/sem_post.3:63 build/C/man3/sem_unlink.3:64 build/C/man3/sem_wait.3:145
129 msgid "POSIX.1-2001."
133 #: build/C/man3/sem_close.3:56 build/C/man3/sem_destroy.3:68 build/C/man3/sem_getvalue.3:67 build/C/man3/sem_init.3:97 build/C/man7/sem_overview.7:140 build/C/man3/sem_post.3:63 build/C/man3/sem_wait.3:145 build/C/man2/semctl.2:465 build/C/man2/semget.2:223 build/C/man2/semop.2:405
139 #: build/C/man3/sem_close.3:60
141 "All open named semaphores are automatically closed on process termination, "
142 "or upon B<execve>(2)."
146 #: build/C/man3/sem_close.3:60 build/C/man3/sem_destroy.3:74 build/C/man3/sem_getvalue.3:71 build/C/man3/sem_init.3:102 build/C/man3/sem_open.3:172 build/C/man7/sem_overview.7:152 build/C/man3/sem_post.3:70 build/C/man3/sem_unlink.3:64 build/C/man3/sem_wait.3:262 build/C/man2/semctl.2:524 build/C/man2/semget.2:294 build/C/man2/semop.2:531
152 #: build/C/man3/sem_close.3:67
154 "B<sem_getvalue>(3), B<sem_open>(3), B<sem_post>(3), B<sem_unlink>(3), "
155 "B<sem_wait>(3), B<sem_overview>(7)"
159 #: build/C/man3/sem_close.3:67 build/C/man3/sem_destroy.3:79 build/C/man3/sem_getvalue.3:75 build/C/man3/sem_init.3:107 build/C/man3/sem_open.3:179 build/C/man7/sem_overview.7:162 build/C/man3/sem_post.3:74 build/C/man3/sem_unlink.3:70 build/C/man3/sem_wait.3:268 build/C/man2/semctl.2:531 build/C/man2/semget.2:301 build/C/man2/semop.2:540
165 #: build/C/man3/sem_close.3:74 build/C/man3/sem_destroy.3:86 build/C/man3/sem_getvalue.3:82 build/C/man3/sem_init.3:114 build/C/man3/sem_open.3:186 build/C/man7/sem_overview.7:169 build/C/man3/sem_post.3:81 build/C/man3/sem_unlink.3:77 build/C/man3/sem_wait.3:275 build/C/man2/semctl.2:538 build/C/man2/semget.2:308 build/C/man2/semop.2:547
167 "This page is part of release 3.50 of the Linux I<man-pages> project. A "
168 "description of the project, and information about reporting bugs, can be "
169 "found at http://www.kernel.org/doc/man-pages/."
173 #: build/C/man3/sem_destroy.3:26
179 #: build/C/man3/sem_destroy.3:29
180 msgid "sem_destroy - destroy an unnamed semaphore"
184 #: build/C/man3/sem_destroy.3:34
186 msgid "B<int sem_destroy(sem_t *>I<sem>B<);>\n"
190 #: build/C/man3/sem_destroy.3:41
192 "B<sem_destroy>() destroys the unnamed semaphore at the address pointed to "
197 #: build/C/man3/sem_destroy.3:46
199 "Only a semaphore that has been initialized by B<sem_init>(3) should be "
200 "destroyed using B<sem_destroy>()."
204 #: build/C/man3/sem_destroy.3:51
206 "Destroying a semaphore that other processes or threads are currently blocked "
207 "on (in B<sem_wait>(3)) produces undefined behavior."
211 #: build/C/man3/sem_destroy.3:55
213 "Using a semaphore that has been destroyed produces undefined results, until "
214 "the semaphore has been reinitialized using B<sem_init>(3)."
218 #: build/C/man3/sem_destroy.3:61
220 "B<sem_destroy>() returns 0 on success; on error, -1 is returned, and "
221 "I<errno> is set to indicate the error."
224 #. But not on NPTL, where sem_destroy () is a no-op..
226 #: build/C/man3/sem_destroy.3:74
228 "An unnamed semaphore should be destroyed with B<sem_destroy>() before the "
229 "memory in which it is located is deallocated. Failure to do this can result "
230 "in resource leaks on some implementations."
234 #: build/C/man3/sem_destroy.3:79
235 msgid "B<sem_init>(3), B<sem_post>(3), B<sem_wait>(3), B<sem_overview>(7)"
239 #: build/C/man3/sem_getvalue.3:26
245 #: build/C/man3/sem_getvalue.3:29
246 msgid "sem_getvalue - get the value of a semaphore"
250 #: build/C/man3/sem_getvalue.3:34
252 msgid "B<int sem_getvalue(sem_t *>I<sem>B<, int *>I<sval>B<);>\n"
256 #: build/C/man3/sem_getvalue.3:43
258 "B<sem_getvalue>() places the current value of the semaphore pointed to "
259 "I<sem> into the integer pointed to by I<sval>."
263 #: build/C/man3/sem_getvalue.3:54
265 "If one or more processes or threads are blocked waiting to lock the "
266 "semaphore with B<sem_wait>(3), POSIX.1-2001 permits two possibilities for "
267 "the value returned in I<sval>: either 0 is returned; or a negative number "
268 "whose absolute value is the count of the number of processes and threads "
269 "currently blocked in B<sem_wait>(3). Linux adopts the former behavior."
273 #: build/C/man3/sem_getvalue.3:60
275 "B<sem_getvalue>() returns 0 on success; on error, -1 is returned and "
276 "I<errno> is set to indicate the error."
280 #: build/C/man3/sem_getvalue.3:71
282 "The value of the semaphore may already have changed by the time "
283 "B<sem_getvalue>() returns."
287 #: build/C/man3/sem_getvalue.3:75
288 msgid "B<sem_post>(3), B<sem_wait>(3), B<sem_overview>(7)"
292 #: build/C/man3/sem_init.3:26
298 #: build/C/man3/sem_init.3:29
299 msgid "sem_init - initialize an unnamed semaphore"
303 #: build/C/man3/sem_init.3:34
306 "B<int sem_init(sem_t *>I<sem>B<, int >I<pshared>B<, unsigned int "
311 #: build/C/man3/sem_init.3:44
313 "B<sem_init>() initializes the unnamed semaphore at the address pointed to "
314 "by I<sem>. The I<value> argument specifies the initial value for the "
319 #: build/C/man3/sem_init.3:49
321 "The I<pshared> argument indicates whether this semaphore is to be shared "
322 "between the threads of a process, or between processes."
326 #: build/C/man3/sem_init.3:57
328 "If I<pshared> has the value 0, then the semaphore is shared between the "
329 "threads of a process, and should be located at some address that is visible "
330 "to all threads (e.g., a global variable, or a variable allocated dynamically "
335 #: build/C/man3/sem_init.3:74
337 "If I<pshared> is nonzero, then the semaphore is shared between processes, "
338 "and should be located in a region of shared memory (see B<shm_open>(3), "
339 "B<mmap>(2), and B<shmget>(2)). (Since a child created by B<fork>(2) "
340 "inherits its parent's memory mappings, it can also access the semaphore.) "
341 "Any process that can access the shared memory region can operate on the "
342 "semaphore using B<sem_post>(3), B<sem_wait>(3), etc."
346 #: build/C/man3/sem_init.3:77
348 "Initializing a semaphore that has already been initialized results in "
349 "undefined behavior."
353 #: build/C/man3/sem_init.3:83
355 "B<sem_init>() returns 0 on success; on error, -1 is returned, and I<errno> "
356 "is set to indicate the error."
360 #: build/C/man3/sem_init.3:89
361 msgid "I<value> exceeds B<SEM_VALUE_MAX>."
365 #: build/C/man3/sem_init.3:89
371 #: build/C/man3/sem_init.3:95
373 "I<pshared> is nonzero, but the system does not support process-shared "
374 "semaphores (see B<sem_overview>(7))."
378 #: build/C/man3/sem_init.3:102
380 "Bizarrely, POSIX.1-2001 does not specify the value that should be returned "
381 "by a successful call to B<sem_init>(). POSIX.1-2008 rectifies this, "
382 "specifying the zero return on success."
386 #: build/C/man3/sem_init.3:107
387 msgid "B<sem_destroy>(3), B<sem_post>(3), B<sem_wait>(3), B<sem_overview>(7)"
391 #: build/C/man3/sem_open.3:26
397 #: build/C/man3/sem_open.3:29
398 msgid "sem_open - initialize and open a named semaphore"
402 #: build/C/man3/sem_open.3:34
405 "B<#include E<lt>fcntl.hE<gt>> /* For O_* constants */\n"
406 "B<#include E<lt>sys/stat.hE<gt>> /* For mode constants */\n"
407 "B<#include E<lt>semaphore.hE<gt>>\n"
411 #: build/C/man3/sem_open.3:38
414 "B<sem_t *sem_open(const char *>I<name>B<, int >I<oflag>B<);>\n"
415 "B<sem_t *sem_open(const char *>I<name>B<, int >I<oflag>B<, >\n"
416 "B< mode_t >I<mode>B<, unsigned int >I<value>B<);>\n"
420 #: build/C/man3/sem_open.3:50
422 "B<sem_open>() creates a new POSIX semaphore or opens an existing "
423 "semaphore. The semaphore is identified by I<name>. For details of the "
424 "construction of I<name>, see B<sem_overview>(7)."
427 #. In reality the file system IDs are used on Linux.
429 #: build/C/man3/sem_open.3:76
431 "The I<oflag> argument specifies flags that control the operation of the "
432 "call. (Definitions of the flags values can be obtained by including "
433 "I<E<lt>fcntl.hE<gt>>.) If B<O_CREAT> is specified in I<oflag>, then the "
434 "semaphore is created if it does not already exist. The owner (user ID) of "
435 "the semaphore is set to the effective user ID of the calling process. The "
436 "group ownership (group ID) is set to the effective group ID of the calling "
437 "process. If both B<O_CREAT> and B<O_EXCL> are specified in I<oflag>, then "
438 "an error is returned if a semaphore with the given I<name> already exists."
442 #: build/C/man3/sem_open.3:104
444 "If B<O_CREAT> is specified in I<oflag>, then two additional arguments must "
445 "be supplied. The I<mode> argument specifies the permissions to be placed on "
446 "the new semaphore, as for B<open>(2). (Symbolic definitions for the "
447 "permissions bits can be obtained by including I<E<lt>sys/stat.hE<gt>>.) The "
448 "permissions settings are masked against the process umask. Both read and "
449 "write permission should be granted to each class of user that will access "
450 "the semaphore. The I<value> argument specifies the initial value for the "
451 "new semaphore. If B<O_CREAT> is specified, and a semaphore with the given "
452 "I<name> already exists, then I<mode> and I<value> are ignored."
456 #: build/C/man3/sem_open.3:116
458 "On success, B<sem_open>() returns the address of the new semaphore; this "
459 "address is used when calling other semaphore-related functions. On error, "
460 "B<sem_open>() returns B<SEM_FAILED>, with I<errno> set to indicate the "
465 #: build/C/man3/sem_open.3:117 build/C/man3/sem_unlink.3:51 build/C/man2/semctl.2:391 build/C/man2/semget.2:167 build/C/man2/semop.2:336
471 #: build/C/man3/sem_open.3:121
472 msgid "The semaphore exists, but the caller does not have permission to open it."
476 #: build/C/man3/sem_open.3:121 build/C/man2/semget.2:175
482 #: build/C/man3/sem_open.3:132
484 "Both B<O_CREAT> and B<O_EXCL> were specified in I<oflag>, but a semaphore "
485 "with this I<name> already exists."
489 #: build/C/man3/sem_open.3:137
490 msgid "I<value> was greater than B<SEM_VALUE_MAX>."
494 #: build/C/man3/sem_open.3:141
495 msgid "I<name> consists of just \"/\", followed by no other characters."
499 #: build/C/man3/sem_open.3:141
505 #: build/C/man3/sem_open.3:144
506 msgid "The process already has the maximum number of files and open."
510 #: build/C/man3/sem_open.3:144 build/C/man3/sem_unlink.3:54
512 msgid "B<ENAMETOOLONG>"
516 #: build/C/man3/sem_open.3:148 build/C/man3/sem_unlink.3:58
517 msgid "I<name> was too long."
521 #: build/C/man3/sem_open.3:148
527 #: build/C/man3/sem_open.3:151
528 msgid "The system limit on the total number of open files has been reached."
532 #: build/C/man3/sem_open.3:151 build/C/man3/sem_unlink.3:58 build/C/man2/semget.2:199
537 #. this error can occur if we have a name of the (nonportable) form
538 #. /dir/name, and the directory /dev/shm/dir does not exist.
540 #: build/C/man3/sem_open.3:167
542 "The B<O_CREAT> flag was not specified in I<oflag> and no semaphore with this "
543 "I<name> exists; or, B<O_CREAT> was specified, but I<name> wasn't well "
548 #: build/C/man3/sem_open.3:167 build/C/man2/semget.2:207 build/C/man2/semop.2:379
554 #: build/C/man3/sem_open.3:170
555 msgid "Insufficient memory."
559 #: build/C/man3/sem_open.3:179
561 "B<sem_close>(3), B<sem_getvalue>(3), B<sem_post>(3), B<sem_unlink>(3), "
562 "B<sem_wait>(3), B<sem_overview>(7)"
566 #: build/C/man7/sem_overview.7:26
572 #: build/C/man7/sem_overview.7:29
573 msgid "sem_overview - overview of POSIX semaphores"
577 #: build/C/man7/sem_overview.7:31
578 msgid "POSIX semaphores allow processes and threads to synchronize their actions."
582 #: build/C/man7/sem_overview.7:41
584 "A semaphore is an integer whose value is never allowed to fall below zero. "
585 "Two operations can be performed on semaphores: increment the semaphore value "
586 "by one (B<sem_post>(3)); and decrement the semaphore value by one "
587 "(B<sem_wait>(3)). If the value of a semaphore is currently zero, then a "
588 "B<sem_wait>(3) operation will block until the value becomes greater than "
593 #: build/C/man7/sem_overview.7:44
594 msgid "POSIX semaphores come in two forms: named semaphores and unnamed semaphores."
598 #: build/C/man7/sem_overview.7:44
600 msgid "B<Named semaphores>"
603 #. glibc allows the initial slash to be omitted, and makes
604 #. multiple initial slashes equivalent to a single slash.
605 #. This differs from the implementation of POSIX message queues.
606 #. glibc allows subdirectory components in the name, in which
607 #. case the subdirectory tree must exist under /dev/shm, and
608 #. the fist subdirectory component must exist as the name
609 #. sem.name, and all of the subdirectory components must allow the
610 #. required permissions if a user wants to create a semaphore
611 #. object in a subdirectory.
613 #: build/C/man7/sem_overview.7:64
615 "A named semaphore is identified by a name of the form I</somename>; that is, "
616 "a null-terminated string of up to B<NAME_MAX>I<-4> (i.e., 251) characters "
617 "consisting of an initial slash, followed by one or more characters, none of "
618 "which are slashes. Two processes can operate on the same named semaphore by "
619 "passing the same name to B<sem_open>(3)."
623 #: build/C/man7/sem_overview.7:79
625 "The B<sem_open>(3) function creates a new named semaphore or opens an "
626 "existing named semaphore. After the semaphore has been opened, it can be "
627 "operated on using B<sem_post>(3) and B<sem_wait>(3). When a process has "
628 "finished using the semaphore, it can use B<sem_close>(3) to close the "
629 "semaphore. When all processes have finished using the semaphore, it can be "
630 "removed from the system using B<sem_unlink>(3)."
634 #: build/C/man7/sem_overview.7:79
636 msgid "B<Unnamed semaphores (memory-based semaphores)>"
640 #: build/C/man7/sem_overview.7:94
642 "An unnamed semaphore does not have a name. Instead the semaphore is placed "
643 "in a region of memory that is shared between multiple threads (a "
644 "I<thread-shared semaphore>) or processes (a I<process-shared semaphore>). "
645 "A thread-shared semaphore is placed in an area of memory shared between the "
646 "threads of a process, for example, a global variable. A process-shared "
647 "semaphore must be placed in a shared memory region (e.g., a System V shared "
648 "memory segment created using B<shmget>(2), or a POSIX shared memory object "
649 "built created using B<shm_open>(3))."
653 #: build/C/man7/sem_overview.7:105
655 "Before being used, an unnamed semaphore must be initialized using "
656 "B<sem_init>(3). It can then be operated on using B<sem_post>(3) and "
657 "B<sem_wait>(3). When the semaphore is no longer required, and before the "
658 "memory in which it is located is deallocated, the semaphore should be "
659 "destroyed using B<sem_destroy>(3)."
663 #: build/C/man7/sem_overview.7:108
665 "The remainder of this section describes some specific details of the Linux "
666 "implementation of POSIX semaphores."
670 #: build/C/man7/sem_overview.7:108
676 #: build/C/man7/sem_overview.7:114
678 "Prior to kernel 2.6, Linux only supported unnamed, thread-shared "
679 "semaphores. On a system with Linux 2.6 and a glibc that provides the NPTL "
680 "threading implementation, a complete implementation of POSIX semaphores is "
685 #: build/C/man7/sem_overview.7:114
691 #: build/C/man7/sem_overview.7:119
693 "POSIX named semaphores have kernel persistence: if not removed by "
694 "B<sem_unlink>(3), a semaphore will exist until the system is shut down."
698 #: build/C/man7/sem_overview.7:119
704 #: build/C/man7/sem_overview.7:124
706 "Programs using the POSIX semaphores API must be compiled with I<cc -pthread> "
707 "to link against the real-time library, I<librt>."
711 #: build/C/man7/sem_overview.7:124
713 msgid "Accessing named semaphores via the file system"
717 #: build/C/man7/sem_overview.7:135
719 "On Linux, named semaphores are created in a virtual file system, normally "
720 "mounted under I</dev/shm>, with names of the form B<sem.>I<somename>. (This "
721 "is the reason that semaphore names are limited to B<NAME_MAX>I<-4> rather "
722 "than B<NAME_MAX> characters.)"
726 #: build/C/man7/sem_overview.7:138
728 "Since Linux 2.6.19, ACLs can be placed on files under this directory, to "
729 "control object permissions on a per-user and per-group basis."
733 #: build/C/man7/sem_overview.7:149
735 "System V semaphores (B<semget>(2), B<semop>(2), etc.) are an older semaphore "
736 "API. POSIX semaphores provide a simpler, and better designed interface than "
737 "System V semaphores; on the other hand POSIX semaphores are less widely "
738 "available (especially on older systems) than System V semaphores."
742 #: build/C/man7/sem_overview.7:149 build/C/man3/sem_post.3:67 build/C/man3/sem_wait.3:153 build/C/man2/semop.2:506
748 #: build/C/man7/sem_overview.7:152
750 "An example of the use of various POSIX semaphore functions is shown in "
755 #: build/C/man7/sem_overview.7:162
757 "B<sem_close>(3), B<sem_destroy>(3), B<sem_getvalue>(3), B<sem_init>(3), "
758 "B<sem_open>(3), B<sem_post>(3), B<sem_unlink>(3), B<sem_wait>(3), "
763 #: build/C/man3/sem_post.3:26
769 #: build/C/man3/sem_post.3:29
770 msgid "sem_post - unlock a semaphore"
774 #: build/C/man3/sem_post.3:34
776 msgid "B<int sem_post(sem_t *>I<sem>B<);>\n"
780 #: build/C/man3/sem_post.3:45
782 "B<sem_post>() increments (unlocks) the semaphore pointed to by I<sem>. If "
783 "the semaphore's value consequently becomes greater than zero, then another "
784 "process or thread blocked in a B<sem_wait>(3) call will be woken up and "
785 "proceed to lock the semaphore."
789 #: build/C/man3/sem_post.3:52
791 "B<sem_post>() returns 0 on success; on error, the value of the semaphore is "
792 "left unchanged, -1 is returned, and I<errno> is set to indicate the error."
796 #: build/C/man3/sem_post.3:57
801 #. Added in POSIX.1-2008 TC1 (Austin Interpretation 213)
803 #: build/C/man3/sem_post.3:61
804 msgid "The maximum allowable value for a semaphore would be exceeded."
808 #: build/C/man3/sem_post.3:67
810 "B<sem_post>() is async-signal-safe: it may be safely called within a signal "
815 #: build/C/man3/sem_post.3:70
816 msgid "See B<sem_wait>(3)."
820 #: build/C/man3/sem_post.3:74
821 msgid "B<sem_getvalue>(3), B<sem_wait>(3), B<sem_overview>(7)"
825 #: build/C/man3/sem_unlink.3:26
831 #: build/C/man3/sem_unlink.3:29
832 msgid "sem_unlink - remove a named semaphore"
836 #: build/C/man3/sem_unlink.3:34
838 msgid "B<int sem_unlink(const char *>I<name>B<);>\n"
842 #: build/C/man3/sem_unlink.3:44
844 "B<sem_unlink>() removes the named semaphore referred to by I<name>. The "
845 "semaphore name is removed immediately. The semaphore is destroyed once all "
846 "other processes that have the semaphore open close it."
850 #: build/C/man3/sem_unlink.3:50
852 "On success B<sem_unlink>() returns 0; on error, -1 is returned, with "
853 "I<errno> set to indicate the error."
857 #: build/C/man3/sem_unlink.3:54
858 msgid "The caller does not have permission to unlink this semaphore."
862 #: build/C/man3/sem_unlink.3:62
863 msgid "There is no semaphore with the given I<name>."
867 #: build/C/man3/sem_unlink.3:70
869 "B<sem_getvalue>(3), B<sem_open>(3), B<sem_post>(3), B<sem_wait>(3), "
874 #: build/C/man3/sem_wait.3:26
880 #: build/C/man3/sem_wait.3:29
881 msgid "sem_wait, sem_timedwait, sem_trywait - lock a semaphore"
885 #: build/C/man3/sem_wait.3:34
887 msgid "B<int sem_wait(sem_t *>I<sem>B<);>\n"
891 #: build/C/man3/sem_wait.3:36
893 msgid "B<int sem_trywait(sem_t *>I<sem>B<);>\n"
897 #: build/C/man3/sem_wait.3:38
900 "B<int sem_timedwait(sem_t *>I<sem>B<, const struct timespec "
901 "*>I<abs_timeout>B<);>\n"
905 #: build/C/man3/sem_wait.3:45 build/C/man2/semop.2:53
906 msgid "Feature Test Macro Requirements for glibc (see B<feature_test_macros>(7)):"
910 #: build/C/man3/sem_wait.3:49
912 "B<sem_timedwait>(): _POSIX_C_SOURCE\\ E<gt>=\\ 200112L || _XOPEN_SOURCE\\ "
917 #: build/C/man3/sem_wait.3:59
919 "B<sem_wait>() decrements (locks) the semaphore pointed to by I<sem>. If "
920 "the semaphore's value is greater than zero, then the decrement proceeds, and "
921 "the function returns, immediately. If the semaphore currently has the value "
922 "zero, then the call blocks until either it becomes possible to perform the "
923 "decrement (i.e., the semaphore value rises above zero), or a signal handler "
924 "interrupts the call."
928 #: build/C/man3/sem_wait.3:69
930 "B<sem_trywait>() is the same as B<sem_wait>(), except that if the decrement "
931 "cannot be immediately performed, then call returns an error (I<errno> set to "
932 "B<EAGAIN>) instead of blocking."
936 #: build/C/man3/sem_wait.3:82
938 "B<sem_timedwait>() is the same as B<sem_wait>(), except that I<abs_timeout> "
939 "specifies a limit on the amount of time that the call should block if the "
940 "decrement cannot be immediately performed. The I<abs_timeout> argument "
941 "points to a structure that specifies an absolute timeout in seconds and "
942 "nanoseconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC). This "
943 "structure is defined as follows:"
947 #: build/C/man3/sem_wait.3:89
950 "struct timespec {\n"
951 " time_t tv_sec; /* Seconds */\n"
952 " long tv_nsec; /* Nanoseconds [0 .. 999999999] */\n"
957 #: build/C/man3/sem_wait.3:100
959 "If the timeout has already expired by the time of the call, and the "
960 "semaphore could not be locked immediately, then B<sem_timedwait>() fails "
961 "with a timeout error (I<errno> set to B<ETIMEDOUT>)."
965 #: build/C/man3/sem_wait.3:108
967 "If the operation can be performed immediately, then B<sem_timedwait>() "
968 "never fails with a timeout error, regardless of the value of "
969 "I<abs_timeout>. Furthermore, the validity of I<abs_timeout> is not checked "
974 #: build/C/man3/sem_wait.3:114
976 "All of these functions return 0 on success; on error, the value of the "
977 "semaphore is left unchanged, -1 is returned, and I<errno> is set to indicate "
982 #: build/C/man3/sem_wait.3:115 build/C/man2/semop.2:368
988 #: build/C/man3/sem_wait.3:119
989 msgid "The call was interrupted by a signal handler; see B<signal>(7)."
993 #: build/C/man3/sem_wait.3:126
994 msgid "The following additional error can occur for B<sem_trywait>():"
998 #: build/C/man3/sem_wait.3:126 build/C/man2/semop.2:343
1004 #: build/C/man3/sem_wait.3:130
1006 "The operation could not be performed without blocking (i.e., the semaphore "
1007 "currently has the value zero)."
1011 #: build/C/man3/sem_wait.3:133
1012 msgid "The following additional errors can occur for B<sem_timedwait>():"
1016 #: build/C/man3/sem_wait.3:138
1018 "The value of I<abs_timeout.tv_nsecs> is less than 0, or greater than or "
1019 "equal to 1000 million."
1023 #: build/C/man3/sem_wait.3:138
1025 msgid "B<ETIMEDOUT>"
1028 #. POSIX.1-2001 also allows EDEADLK -- "A deadlock condition
1029 #. was detected", but this does not occur on Linux(?).
1031 #: build/C/man3/sem_wait.3:143
1032 msgid "The call timed out before the semaphore could be locked."
1035 #. sem_wait() is always interrupted on most other implementations,
1036 #. but on FreeBSD 5.4 SA_RESTART does cause restarting.
1038 #: build/C/man3/sem_wait.3:153
1040 "A signal handler always interrupts a blocked call to one of these functions, "
1041 "regardless of the use of the B<sigaction>(2) B<SA_RESTART> flag."
1045 #: build/C/man3/sem_wait.3:172
1047 "The (somewhat trivial) program shown below operates on an unnamed "
1048 "semaphore. The program expects two command-line arguments. The first "
1049 "argument specifies a seconds value that is used to set an alarm timer to "
1050 "generate a B<SIGALRM> signal. This handler performs a B<sem_post>(3) to "
1051 "increment the semaphore that is being waited on in I<main()> using "
1052 "B<sem_timedwait>(). The second command-line argument specifies the length "
1053 "of the timeout, in seconds, for B<sem_timedwait>(). The following shows "
1054 "what happens on two different runs of the program:"
1058 #: build/C/man3/sem_wait.3:182
1061 "$B< ./a.out 2 3>\n"
1062 "About to call sem_timedwait()\n"
1063 "sem_post() from handler\n"
1064 "sem_timedwait() succeeded\n"
1065 "$B< ./a.out 2 1>\n"
1066 "About to call sem_timedwait()\n"
1067 "sem_timedwait() timed out\n"
1071 #: build/C/man3/sem_wait.3:184
1073 msgid "Program source"
1077 #: build/C/man3/sem_wait.3:195
1080 "#include E<lt>unistd.hE<gt>\n"
1081 "#include E<lt>stdio.hE<gt>\n"
1082 "#include E<lt>stdlib.hE<gt>\n"
1083 "#include E<lt>semaphore.hE<gt>\n"
1084 "#include E<lt>time.hE<gt>\n"
1085 "#include E<lt>assert.hE<gt>\n"
1086 "#include E<lt>errno.hE<gt>\n"
1087 "#include E<lt>signal.hE<gt>\n"
1091 #: build/C/man3/sem_wait.3:197
1093 msgid "sem_t sem;\n"
1097 #: build/C/man3/sem_wait.3:200
1100 "#define handle_error(msg) \\e\n"
1101 " do { perror(msg); exit(EXIT_FAILURE); } while (0)\n"
1105 #: build/C/man3/sem_wait.3:210
1109 "handler(int sig)\n"
1111 " write(STDOUT_FILENO, \"sem_post() from handler\\en\", 24);\n"
1112 " if (sem_post(&sem) == -1) {\n"
1113 " write(STDERR_FILENO, \"sem_post() failed\\en\", 18);\n"
1114 " _exit(EXIT_FAILURE);\n"
1120 #: build/C/man3/sem_wait.3:217
1124 "main(int argc, char *argv[])\n"
1126 " struct sigaction sa;\n"
1127 " struct timespec ts;\n"
1132 #: build/C/man3/sem_wait.3:223
1135 " if (argc != 3) {\n"
1136 " fprintf(stderr, \"Usage: %s E<lt>alarm-secsE<gt> "
1137 "E<lt>wait-secsE<gt>\\en\",\n"
1139 " exit(EXIT_FAILURE);\n"
1144 #: build/C/man3/sem_wait.3:226
1147 " if (sem_init(&sem, 0, 0) == -1)\n"
1148 " handle_error(\"sem_init\");\n"
1152 #: build/C/man3/sem_wait.3:228
1154 msgid " /* Establish SIGALRM handler; set alarm timer using argv[1] */\n"
1158 #: build/C/man3/sem_wait.3:234
1161 " sa.sa_handler = handler;\n"
1162 " sigemptyset(&sa.sa_mask);\n"
1163 " sa.sa_flags = 0;\n"
1164 " if (sigaction(SIGALRM, &sa, NULL) == -1)\n"
1165 " handle_error(\"sigaction\");\n"
1169 #: build/C/man3/sem_wait.3:236
1171 msgid " alarm(atoi(argv[1]));\n"
1175 #: build/C/man3/sem_wait.3:239
1178 " /* Calculate relative interval as current time plus\n"
1179 " number of seconds given argv[2] */\n"
1183 #: build/C/man3/sem_wait.3:242
1186 " if (clock_gettime(CLOCK_REALTIME, &ts) == -1)\n"
1187 " handle_error(\"clock_gettime\");\n"
1191 #: build/C/man3/sem_wait.3:244
1193 msgid " ts.tv_sec += atoi(argv[2]);\n"
1197 #: build/C/man3/sem_wait.3:248
1200 " printf(\"main() about to call sem_timedwait()\\en\");\n"
1201 " while ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR)\n"
1202 " continue; /* Restart if interrupted by handler */\n"
1206 #: build/C/man3/sem_wait.3:250
1208 msgid " /* Check what happened */\n"
1212 #: build/C/man3/sem_wait.3:258
1216 " if (errno == ETIMEDOUT)\n"
1217 " printf(\"sem_timedwait() timed out\\en\");\n"
1219 " perror(\"sem_timedwait\");\n"
1221 " printf(\"sem_timedwait() succeeded\\en\");\n"
1225 #: build/C/man3/sem_wait.3:261
1228 " exit((s == 0) ? EXIT_SUCCESS : EXIT_FAILURE);\n"
1233 #: build/C/man3/sem_wait.3:268
1235 "B<clock_gettime>(2), B<sem_getvalue>(3), B<sem_post>(3), B<sem_overview>(7), "
1240 #: build/C/man2/semctl.2:41
1246 #: build/C/man2/semctl.2:41 build/C/man2/semget.2:36
1252 #: build/C/man2/semctl.2:44
1253 msgid "semctl - semaphore control operations"
1257 #: build/C/man2/semctl.2:49 build/C/man2/semget.2:44 build/C/man2/semop.2:43
1260 "B<#include E<lt>sys/types.hE<gt>>\n"
1261 "B<#include E<lt>sys/ipc.hE<gt>>\n"
1262 "B<#include E<lt>sys/sem.hE<gt>>\n"
1266 #: build/C/man2/semctl.2:51
1268 msgid "B<int semctl(int >I<semid>B<, int >I<semnum>B<, int >I<cmd>B<, ...);>\n"
1272 #: build/C/man2/semctl.2:62
1274 "B<semctl>() performs the control operation specified by I<cmd> on the "
1275 "semaphore set identified by I<semid>, or on the I<semnum>-th semaphore of "
1276 "that set. (The semaphores in a set are numbered starting at 0.)"
1280 #: build/C/man2/semctl.2:68
1282 "This function has three or four arguments, depending on I<cmd>. When there "
1283 "are four, the fourth has the type I<union semun>. The I<calling program> "
1284 "must define this union as follows:"
1288 #: build/C/man2/semctl.2:78
1292 " int val; /* Value for SETVAL */\n"
1293 " struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */\n"
1294 " unsigned short *array; /* Array for GETALL, SETALL */\n"
1295 " struct seminfo *__buf; /* Buffer for IPC_INFO\n"
1296 " (Linux-specific) */\n"
1301 #: build/C/man2/semctl.2:84
1303 "The I<semid_ds> data structure is defined in I<E<lt>sys/sem.hE<gt>> as "
1308 #: build/C/man2/semctl.2:93
1311 "struct semid_ds {\n"
1312 " struct ipc_perm sem_perm; /* Ownership and permissions */\n"
1313 " time_t sem_otime; /* Last semop time */\n"
1314 " time_t sem_ctime; /* Last change time */\n"
1315 " unsigned short sem_nsems; /* No. of semaphores in set */\n"
1320 #: build/C/man2/semctl.2:101
1322 "The I<ipc_perm> structure is defined as follows (the highlighted fields are "
1323 "settable using B<IPC_SET>):"
1327 #: build/C/man2/semctl.2:113
1330 "struct ipc_perm {\n"
1331 " key_t __key; /* Key supplied to semget(2) */\n"
1332 " uid_t B<uid>; /* Effective UID of owner */\n"
1333 " gid_t B<gid>; /* Effective GID of owner */\n"
1334 " uid_t cuid; /* Effective UID of creator */\n"
1335 " gid_t cgid; /* Effective GID of creator */\n"
1336 " unsigned short B<mode>; /* Permissions */\n"
1337 " unsigned short __seq; /* Sequence number */\n"
1342 #: build/C/man2/semctl.2:119
1343 msgid "Valid values for I<cmd> are:"
1347 #: build/C/man2/semctl.2:119
1353 #: build/C/man2/semctl.2:131
1355 "Copy information from the kernel data structure associated with I<semid> "
1356 "into the I<semid_ds> structure pointed to by I<arg.buf>. The argument "
1357 "I<semnum> is ignored. The calling process must have read permission on the "
1362 #: build/C/man2/semctl.2:131
1368 #: build/C/man2/semctl.2:154
1370 "Write the values of some members of the I<semid_ds> structure pointed to by "
1371 "I<arg.buf> to the kernel data structure associated with this semaphore set, "
1372 "updating also its I<sem_ctime> member. The following members of the "
1373 "structure are updated: I<sem_perm.uid>, I<sem_perm.gid>, and (the least "
1374 "significant 9 bits of) I<sem_perm.mode>. The effective UID of the calling "
1375 "process must match the owner (I<sem_perm.uid>) or creator "
1376 "(I<sem_perm.cuid>) of the semaphore set, or the caller must be privileged. "
1377 "The argument I<semnum> is ignored."
1381 #: build/C/man2/semctl.2:154
1387 #: build/C/man2/semctl.2:169
1389 "Immediately remove the semaphore set, awakening all processes blocked in "
1390 "B<semop>(2) calls on the set (with an error return and I<errno> set to "
1391 "B<EIDRM>). The effective user ID of the calling process must match the "
1392 "creator or owner of the semaphore set, or the caller must be privileged. "
1393 "The argument I<semnum> is ignored."
1397 #: build/C/man2/semctl.2:169
1399 msgid "B<IPC_INFO> (Linux-specific)"
1403 #: build/C/man2/semctl.2:181
1405 "Returns information about system-wide semaphore limits and parameters in the "
1406 "structure pointed to by I<arg.__buf>. This structure is of type I<seminfo>, "
1407 "defined in I<E<lt>sys/sem.hE<gt>> if the B<_GNU_SOURCE> feature test macro "
1412 #: build/C/man2/semctl.2:203
1415 "struct seminfo {\n"
1416 " int semmap; /* Number of entries in semaphore\n"
1417 " map; unused within kernel */\n"
1418 " int semmni; /* Maximum number of semaphore sets */\n"
1419 " int semmns; /* Maximum number of semaphores in all\n"
1420 " semaphore sets */\n"
1421 " int semmnu; /* System-wide maximum number of undo\n"
1422 " structures; unused within kernel */\n"
1423 " int semmsl; /* Maximum number of semaphores in a\n"
1425 " int semopm; /* Maximum number of operations for\n"
1427 " int semume; /* Maximum number of undo entries per\n"
1428 " process; unused within kernel */\n"
1429 " int semusz; /* Size of struct sem_undo */\n"
1430 " int semvmx; /* Maximum semaphore value */\n"
1431 " int semaem; /* Max. value that can be recorded for\n"
1432 " semaphore adjustment (SEM_UNDO) */\n"
1437 #: build/C/man2/semctl.2:217
1439 "The I<semmsl>, I<semmns>, I<semopm>, and I<semmni> settings can be changed "
1440 "via I</proc/sys/kernel/sem>; see B<proc>(5) for details."
1444 #: build/C/man2/semctl.2:217
1446 msgid "B<SEM_INFO> (Linux-specific)"
1450 #: build/C/man2/semctl.2:231
1452 "Returns a I<seminfo> structure containing the same information as for "
1453 "B<IPC_INFO>, except that the following fields are returned with information "
1454 "about system resources consumed by semaphores: the I<semusz> field returns "
1455 "the number of semaphore sets that currently exist on the system; and the "
1456 "I<semaem> field returns the total number of semaphores in all semaphore sets "
1461 #: build/C/man2/semctl.2:231
1463 msgid "B<SEM_STAT> (Linux-specific)"
1467 #: build/C/man2/semctl.2:242
1469 "Returns a I<semid_ds> structure as for B<IPC_STAT>. However, the I<semid> "
1470 "argument is not a semaphore identifier, but instead an index into the "
1471 "kernel's internal array that maintains information about all semaphore sets "
1476 #: build/C/man2/semctl.2:242
1482 #: build/C/man2/semctl.2:253
1484 "Return B<semval> (i.e., the current value) for all semaphores of the set "
1485 "into I<arg.array>. The argument I<semnum> is ignored. The calling process "
1486 "must have read permission on the semaphore set."
1490 #: build/C/man2/semctl.2:253 build/C/man2/semctl.2:351
1496 #: build/C/man2/semctl.2:266
1498 "The system call returns the value of B<semncnt> for the I<semnum>-th "
1499 "semaphore of the set (i.e., the number of processes waiting for an increase "
1500 "of B<semval> for the I<semnum>-th semaphore of the set). The calling "
1501 "process must have read permission on the semaphore set."
1505 #: build/C/man2/semctl.2:266 build/C/man2/semctl.2:355
1511 #: build/C/man2/semctl.2:279
1513 "The system call returns the value of B<sempid> for the I<semnum>-th "
1514 "semaphore of the set (i.e., the PID of the process that executed the last "
1515 "B<semop>(2) call for the I<semnum>-th semaphore of the set). The calling "
1516 "process must have read permission on the semaphore set."
1520 #: build/C/man2/semctl.2:279 build/C/man2/semctl.2:359
1526 #: build/C/man2/semctl.2:287
1528 "The system call returns the value of B<semval> for the I<semnum>-th "
1529 "semaphore of the set. The calling process must have read permission on the "
1534 #: build/C/man2/semctl.2:287 build/C/man2/semctl.2:363
1540 #: build/C/man2/semctl.2:300
1542 "The system call returns the value of B<semzcnt> for the I<semnum>-th "
1543 "semaphore of the set (i.e., the number of processes waiting for B<semval> of "
1544 "the I<semnum>-th semaphore of the set to become 0). The calling process "
1545 "must have read permission on the semaphore set."
1549 #: build/C/man2/semctl.2:300
1555 #: build/C/man2/semctl.2:322
1557 "Set B<semval> for all semaphores of the set using I<arg.array>, updating "
1558 "also the I<sem_ctime> member of the I<semid_ds> structure associated with "
1559 "the set. Undo entries (see B<semop>(2)) are cleared for altered semaphores "
1560 "in all processes. If the changes to semaphore values would permit blocked "
1561 "B<semop>(2) calls in other processes to proceed, then those processes are "
1562 "woken up. The argument I<semnum> is ignored. The calling process must have "
1563 "alter (write) permission on the semaphore set."
1567 #: build/C/man2/semctl.2:322
1573 #: build/C/man2/semctl.2:340
1575 "Set the value of B<semval> to I<arg.val> for the I<semnum>-th semaphore of "
1576 "the set, updating also the I<sem_ctime> member of the I<semid_ds> structure "
1577 "associated with the set. Undo entries are cleared for altered semaphores in "
1578 "all processes. If the changes to semaphore values would permit blocked "
1579 "B<semop>(2) calls in other processes to proceed, then those processes are "
1580 "woken up. The calling process must have alter permission on the semaphore "
1585 #: build/C/man2/semctl.2:347
1586 msgid "On failure B<semctl>() returns -1 with I<errno> indicating the error."
1590 #: build/C/man2/semctl.2:351
1592 "Otherwise the system call returns a nonnegative value depending on I<cmd> as "
1597 #: build/C/man2/semctl.2:355
1598 msgid "the value of B<semncnt>."
1602 #: build/C/man2/semctl.2:359
1603 msgid "the value of B<sempid>."
1607 #: build/C/man2/semctl.2:363
1608 msgid "the value of B<semval>."
1612 #: build/C/man2/semctl.2:367
1613 msgid "the value of B<semzcnt>."
1617 #: build/C/man2/semctl.2:367
1623 #: build/C/man2/semctl.2:375
1625 "the index of the highest used entry in the kernel's internal array recording "
1626 "information about all semaphore sets. (This information can be used with "
1627 "repeated B<SEM_STAT> operations to obtain information about all semaphore "
1628 "sets on the system.)"
1632 #: build/C/man2/semctl.2:375
1638 #: build/C/man2/semctl.2:379
1639 msgid "As for B<IPC_INFO>."
1643 #: build/C/man2/semctl.2:379
1649 #: build/C/man2/semctl.2:383
1650 msgid "the identifier of the semaphore set whose index was given in I<semid>."
1654 #: build/C/man2/semctl.2:387
1655 msgid "All other I<cmd> values return 0 on success."
1659 #: build/C/man2/semctl.2:391
1660 msgid "On failure, I<errno> will be set to one of the following:"
1664 #: build/C/man2/semctl.2:410
1666 "The argument I<cmd> has one of the values B<GETALL>, B<GETPID>, B<GETVAL>, "
1667 "B<GETNCNT>, B<GETZCNT>, B<IPC_STAT>, B<SEM_STAT>, B<SETALL>, or B<SETVAL> "
1668 "and the calling process does not have the required permissions on the "
1669 "semaphore set and does not have the B<CAP_IPC_OWNER> capability."
1673 #: build/C/man2/semctl.2:410 build/C/man2/semop.2:352
1679 #: build/C/man2/semctl.2:417
1680 msgid "The address pointed to by I<arg.buf> or I<arg.array> isn't accessible."
1684 #: build/C/man2/semctl.2:417 build/C/man2/semop.2:365
1690 #: build/C/man2/semctl.2:420 build/C/man2/semop.2:368
1691 msgid "The semaphore set was removed."
1695 #: build/C/man2/semctl.2:431
1697 "Invalid value for I<cmd> or I<semid>. Or: for a B<SEM_STAT> operation, the "
1698 "index value specified in I<semid> referred to an array slot that is "
1703 #: build/C/man2/semctl.2:431
1709 #: build/C/man2/semctl.2:449
1711 "The argument I<cmd> has the value B<IPC_SET> or B<IPC_RMID> but the "
1712 "effective user ID of the calling process is not the creator (as found in "
1713 "I<sem_perm.cuid>) or the owner (as found in I<sem_perm.uid>) of the "
1714 "semaphore set, and the process does not have the B<CAP_SYS_ADMIN> "
1719 #: build/C/man2/semctl.2:449 build/C/man2/semop.2:387
1725 #: build/C/man2/semctl.2:462
1727 "The argument I<cmd> has the value B<SETALL> or B<SETVAL> and the value to "
1728 "which B<semval> is to be set (for some semaphore of the set) is less than 0 "
1729 "or greater than the implementation limit B<SEMVMX>."
1732 #. SVr4 documents additional error conditions EINVAL, EFBIG, ENOSPC.
1734 #: build/C/man2/semctl.2:465 build/C/man2/semget.2:223 build/C/man2/semop.2:405
1735 msgid "SVr4, POSIX.1-2001."
1738 #. Like Linux, the FreeBSD man pages still document
1739 #. the inclusion of these header files.
1741 #: build/C/man2/semctl.2:478 build/C/man2/semget.2:236 build/C/man2/semop.2:418
1743 "The inclusion of I<E<lt>sys/types.hE<gt>> and I<E<lt>sys/ipc.hE<gt>> isn't "
1744 "required on Linux or by any version of POSIX. However, some old "
1745 "implementations required the inclusion of these header files, and the SVID "
1746 "also documented their inclusion. Applications intended to be portable to "
1747 "such old systems may need to include these header files."
1751 #: build/C/man2/semctl.2:489
1753 "The B<IPC_INFO>, B<SEM_STAT> and B<SEM_INFO> operations are used by the "
1754 "B<ipcs>(1) program to provide information on allocated resources. In the "
1755 "future these may modified or moved to a /proc file system interface."
1759 #: build/C/man2/semctl.2:502
1761 "Various fields in a I<struct semid_ds> were typed as I<short> under Linux "
1762 "2.2 and have become I<long> under Linux 2.4. To take advantage of this, a "
1763 "recompilation under glibc-2.1.91 or later should suffice. (The kernel "
1764 "distinguishes old and new calls by an B<IPC_64> flag in I<cmd>.)"
1768 #: build/C/man2/semctl.2:511
1770 "In some earlier versions of glibc, the I<semun> union was defined in "
1771 "I<E<lt>sys/sem.hE<gt>>, but POSIX.1-2001 requires that the caller define "
1772 "this union. On versions of glibc where this union is I<not> defined, the "
1773 "macro B<_SEM_SEMUN_UNDEFINED> is defined in I<E<lt>sys/sem.hE<gt>>."
1777 #: build/C/man2/semctl.2:515
1778 msgid "The following system limit on semaphore sets affects a B<semctl>() call:"
1782 #: build/C/man2/semctl.2:515 build/C/man2/semop.2:464
1788 #: build/C/man2/semctl.2:520
1789 msgid "Maximum value for B<semval>: implementation dependent (32767)."
1793 #: build/C/man2/semctl.2:524
1795 "For greater portability it is best to always call B<semctl>() with four "
1800 #: build/C/man2/semctl.2:531
1802 "B<ipc>(2), B<semget>(2), B<semop>(2), B<capabilities>(7), "
1803 "B<sem_overview>(7), B<svipc>(7)"
1807 #: build/C/man2/semget.2:36
1813 #: build/C/man2/semget.2:39
1814 msgid "semget - get a semaphore set identifier"
1818 #: build/C/man2/semget.2:49
1819 msgid "B<int semget(key_t >I<key>B<,> B<int >I<nsems>B<,> B<int >I<semflg>B<);>"
1823 #: build/C/man2/semget.2:67
1825 "The B<semget>() system call returns the semaphore set identifier associated "
1826 "with the argument I<key>. A new set of I<nsems> semaphores is created if "
1827 "I<key> has the value B<IPC_PRIVATE> or if no existing semaphore set is "
1828 "associated with I<key> and B<IPC_CREAT> is specified in I<semflg>."
1832 #: build/C/man2/semget.2:86
1834 "If I<semflg> specifies both B<IPC_CREAT> and B<IPC_EXCL> and a semaphore set "
1835 "already exists for I<key>, then B<semget>() fails with I<errno> set to "
1836 "B<EEXIST>. (This is analogous to the effect of the combination B<O_CREAT | "
1837 "O_EXCL> for B<open>(2).)"
1841 #: build/C/man2/semget.2:99
1843 "Upon creation, the least significant 9 bits of the argument I<semflg> define "
1844 "the permissions (for owner, group and others) for the semaphore set. These "
1845 "bits have the same format, and the same meaning, as the I<mode> argument of "
1846 "B<open>(2) (though the execute permissions are not meaningful for "
1847 "semaphores, and write permissions mean permission to alter semaphore "
1851 #. In truth, every one of the many implementations that I've tested sets
1852 #. the values to zero, but I suppose there is/was some obscure
1853 #. implementation out there that does not.
1855 #: build/C/man2/semget.2:109
1857 "The values of the semaphores in a newly created set are indeterminate. "
1858 "(POSIX.1-2001 is explicit on this point.) Although Linux, like many other "
1859 "implementations, initializes the semaphore values to 0, a portable "
1860 "application cannot rely on this: it should explicitly initialize the "
1861 "semaphores to the desired values."
1865 #: build/C/man2/semget.2:117
1867 "When creating a new semaphore set, B<semget>() initializes the set's "
1868 "associated data structure, I<semid_ds> (see B<semctl>(2)), as follows:"
1872 #: build/C/man2/semget.2:122
1874 "I<sem_perm.cuid> and I<sem_perm.uid> are set to the effective user ID of the "
1879 #: build/C/man2/semget.2:127
1881 "I<sem_perm.cgid> and I<sem_perm.gid> are set to the effective group ID of "
1882 "the calling process."
1886 #: build/C/man2/semget.2:132
1888 "The least significant 9 bits of I<sem_perm.mode> are set to the least "
1889 "significant 9 bits of I<semflg>."
1893 #: build/C/man2/semget.2:136
1894 msgid "I<sem_nsems> is set to the value of I<nsems>."
1898 #: build/C/man2/semget.2:139
1899 msgid "I<sem_otime> is set to 0."
1903 #: build/C/man2/semget.2:142
1904 msgid "I<sem_ctime> is set to the current time."
1908 #: build/C/man2/semget.2:153
1910 "The argument I<nsems> can be 0 (a don't care) when a semaphore set is not "
1911 "being created. Otherwise I<nsems> must be greater than 0 and less than or "
1912 "equal to the maximum number of semaphores per semaphore set (B<SEMMSL>)."
1915 #. and a check is made to see if it is marked for destruction.
1917 #: build/C/man2/semget.2:157
1918 msgid "If the semaphore set already exists, the permissions are verified."
1922 #: build/C/man2/semget.2:163
1924 "If successful, the return value will be the semaphore set identifier (a "
1925 "nonnegative integer), otherwise -1 is returned, with I<errno> indicating the "
1930 #: build/C/man2/semget.2:167
1931 msgid "On failure I<errno> will be set to one of the following:"
1935 #: build/C/man2/semget.2:175
1937 "A semaphore set exists for I<key>, but the calling process does not have "
1938 "permission to access the set, and does not have the B<CAP_IPC_OWNER> "
1944 #. The semaphore set is marked to be deleted.
1946 #: build/C/man2/semget.2:188
1948 "A semaphore set exists for I<key> and I<semflg> specified both B<IPC_CREAT> "
1953 #: build/C/man2/semget.2:199
1955 "I<nsems> is less than 0 or greater than the limit on the number of "
1956 "semaphores per semaphore set (B<SEMMSL>), or a semaphore set corresponding "
1957 "to I<key> already exists, and I<nsems> is larger than the number of "
1958 "semaphores in that set."
1962 #: build/C/man2/semget.2:207
1964 "No semaphore set exists for I<key> and I<semflg> did not specify "
1969 #: build/C/man2/semget.2:211
1971 "A semaphore set has to be created but the system does not have enough memory "
1972 "for the new data structure."
1976 #: build/C/man2/semget.2:211
1982 #: build/C/man2/semget.2:219
1984 "A semaphore set has to be created but the system limit for the maximum "
1985 "number of semaphore sets (B<SEMMNI>), or the system wide maximum number of "
1986 "semaphores (B<SEMMNS>), would be exceeded."
1990 #: build/C/man2/semget.2:246
1992 "B<IPC_PRIVATE> isn't a flag field but a I<key_t> type. If this special "
1993 "value is used for I<key>, the system call ignores everything but the least "
1994 "significant 9 bits of I<semflg> and creates a new semaphore set (on "
1999 #: build/C/man2/semget.2:250
2001 "The following limits on semaphore set resources affect the B<semget>() "
2006 #: build/C/man2/semget.2:250
2011 #. This /proc file is not available in Linux 2.2 and earlier -- MTK
2013 #: build/C/man2/semget.2:256
2015 "System wide maximum number of semaphore sets: policy dependent (on Linux, "
2016 "this limit can be read and modified via the fourth field of "
2017 "I</proc/sys/kernel/sem>)."
2021 #: build/C/man2/semget.2:256
2027 #: build/C/man2/semget.2:261
2029 "Maximum number of semaphores per semid: implementation dependent (on Linux, "
2030 "this limit can be read and modified via the first field of "
2031 "I</proc/sys/kernel/sem>)."
2035 #: build/C/man2/semget.2:261
2041 #: build/C/man2/semget.2:269
2043 "System wide maximum number of semaphores: policy dependent (on Linux, this "
2044 "limit can be read and modified via the second field of "
2045 "I</proc/sys/kernel/sem>). Values greater than B<SEMMSL * SEMMNI> makes it "
2050 #: build/C/man2/semget.2:269 build/C/man2/semop.2:476
2056 #: build/C/man2/semget.2:275
2058 "The name choice B<IPC_PRIVATE> was perhaps unfortunate, B<IPC_NEW> would "
2059 "more clearly show its function."
2062 #. In fact they are initialized to zero on Linux, but POSIX.1-2001
2063 #. does not specify this, and we can't portably rely on it.
2065 #: build/C/man2/semget.2:294
2067 "The semaphores in a set are not initialized by B<semget>(). In order to "
2068 "initialize the semaphores, B<semctl>(2) must be used to perform a B<SETVAL> "
2069 "or a B<SETALL> operation on the semaphore set. (Where multiple peers do not "
2070 "know who will be the first to initialize the set, checking for a nonzero "
2071 "I<sem_otime> in the associated data structure retrieved by a B<semctl>(2) "
2072 "B<IPC_STAT> operation can be used to avoid races.)"
2076 #: build/C/man2/semget.2:301
2078 "B<semctl>(2), B<semop>(2), B<ftok>(3), B<capabilities>(7), "
2079 "B<sem_overview>(7), B<svipc>(7)"
2083 #: build/C/man2/semop.2:35
2089 #: build/C/man2/semop.2:35
2095 #: build/C/man2/semop.2:38
2096 msgid "semop, semtimedop - semaphore operations"
2100 #: build/C/man2/semop.2:45
2103 "B<int semop(int >I<semid>B<, struct sembuf *>I<sops>B<, unsigned "
2108 #: build/C/man2/semop.2:48
2111 "B<int semtimedop(int >I<semid>B<, struct sembuf *>I<sops>B<, unsigned "
2113 "B< struct timespec *>I<timeout>B<);>\n"
2117 #: build/C/man2/semop.2:57
2118 msgid "B<semtimedop>(): _GNU_SOURCE"
2122 #: build/C/man2/semop.2:59
2123 msgid "Each semaphore in a semaphore set has the following associated values:"
2127 #: build/C/man2/semop.2:66
2130 "unsigned short semval; /* semaphore value */\n"
2131 "unsigned short semzcnt; /* # waiting for zero */\n"
2132 "unsigned short semncnt; /* # waiting for increase */\n"
2133 "pid_t sempid; /* ID of process that did last op */\n"
2137 #: build/C/man2/semop.2:80
2139 "B<semop>() performs operations on selected semaphores in the set indicated "
2140 "by I<semid>. Each of the I<nsops> elements in the array pointed to by "
2141 "I<sops> specifies an operation to be performed on a single semaphore. The "
2142 "elements of this structure are of type I<struct sembuf>, containing the "
2143 "following members:"
2147 #: build/C/man2/semop.2:86
2150 "unsigned short sem_num; /* semaphore number */\n"
2151 "short sem_op; /* semaphore operation */\n"
2152 "short sem_flg; /* operation flags */\n"
2156 #: build/C/man2/semop.2:98
2158 "Flags recognized in I<sem_flg> are B<IPC_NOWAIT> and B<SEM_UNDO>. If an "
2159 "operation specifies B<SEM_UNDO>, it will be automatically undone when the "
2160 "process terminates."
2164 #: build/C/man2/semop.2:113
2166 "The set of operations contained in I<sops> is performed in I<array order>, "
2167 "and I<atomically>, that is, the operations are performed either as a "
2168 "complete unit, or not at all. The behavior of the system call if not all "
2169 "operations can be performed immediately depends on the presence of the "
2170 "B<IPC_NOWAIT> flag in the individual I<sem_flg> fields, as noted below."
2174 #: build/C/man2/semop.2:120
2176 "Each operation is performed on the I<sem_num>-th semaphore of the semaphore "
2177 "set, where the first semaphore of the set is numbered 0. There are three "
2178 "types of operation, distinguished by the value of I<sem_op>."
2182 #: build/C/man2/semop.2:133
2184 "If I<sem_op> is a positive integer, the operation adds this value to the "
2185 "semaphore value (I<semval>). Furthermore, if B<SEM_UNDO> is specified for "
2186 "this operation, the system updates the undo count (I<semadj>) for this "
2187 "semaphore. This operation can always proceed\\(emit never forces a thread "
2188 "to wait. The calling process must have alter permission on the semaphore "
2193 #: build/C/man2/semop.2:158
2195 "If I<sem_op> is zero, the process must have read permission on the semaphore "
2196 "set. This is a \"wait-for-zero\" operation: if I<semval> is zero, the "
2197 "operation can immediately proceed. Otherwise, if B<IPC_NOWAIT> is specified "
2198 "in I<sem_flg>, B<semop>() fails with I<errno> set to B<EAGAIN> (and none of "
2199 "the operations in I<sops> is performed). Otherwise I<semzcnt> (the count of "
2200 "threads waiting until this semaphore's value becomes zero) is incremented "
2201 "by one and the thread sleeps until one of the following occurs:"
2205 #: build/C/man2/semop.2:158 build/C/man2/semop.2:163 build/C/man2/semop.2:171 build/C/man2/semop.2:181 build/C/man2/semop.2:232 build/C/man2/semop.2:247 build/C/man2/semop.2:254 build/C/man2/semop.2:264
2211 #: build/C/man2/semop.2:163
2212 msgid "I<semval> becomes 0, at which time the value of I<semzcnt> is decremented."
2216 #: build/C/man2/semop.2:171
2218 "The semaphore set is removed: B<semop>() fails, with I<errno> set to "
2223 #: build/C/man2/semop.2:181
2225 "The calling thread catches a signal: the value of I<semzcnt> is decremented "
2226 "and B<semop>() fails, with I<errno> set to B<EINTR>."
2230 #: build/C/man2/semop.2:192
2232 "The time limit specified by I<timeout> in a B<semtimedop>() call expires: "
2233 "B<semop>() fails, with I<errno> set to B<EAGAIN>."
2237 #: build/C/man2/semop.2:232
2239 "If I<sem_op> is less than zero, the process must have alter permission on "
2240 "the semaphore set. If I<semval> is greater than or equal to the absolute "
2241 "value of I<sem_op>, the operation can proceed immediately: the absolute "
2242 "value of I<sem_op> is subtracted from I<semval>, and, if B<SEM_UNDO> is "
2243 "specified for this operation, the system updates the undo count (I<semadj>) "
2244 "for this semaphore. If the absolute value of I<sem_op> is greater than "
2245 "I<semval>, and B<IPC_NOWAIT> is specified in I<sem_flg>, B<semop>() fails, "
2246 "with I<errno> set to B<EAGAIN> (and none of the operations in I<sops> is "
2247 "performed). Otherwise I<semncnt> (the counter of threads waiting for this "
2248 "semaphore's value to increase) is incremented by one and the thread sleeps "
2249 "until one of the following occurs:"
2253 #: build/C/man2/semop.2:247
2255 "I<semval> becomes greater than or equal to the absolute value of I<sem_op>, "
2256 "at which time the value of I<semncnt> is decremented, the absolute value of "
2257 "I<sem_op> is subtracted from I<semval> and, if B<SEM_UNDO> is specified for "
2258 "this operation, the system updates the undo count (I<semadj>) for this "
2263 #: build/C/man2/semop.2:254
2265 "The semaphore set is removed from the system: B<semop>() fails, with "
2266 "I<errno> set to B<EIDRM>."
2270 #: build/C/man2/semop.2:264
2272 "The calling thread catches a signal: the value of I<semncnt> is decremented "
2273 "and B<semop>() fails, with I<errno> set to B<EINTR>."
2277 #: build/C/man2/semop.2:273
2279 "The time limit specified by I<timeout> in a B<semtimedop>() call expires: "
2280 "the system call fails, with I<errno> set to B<EAGAIN>."
2286 #: build/C/man2/semop.2:284
2288 "On successful completion, the I<sempid> value for each semaphore specified "
2289 "in the array pointed to by I<sops> is set to the caller's process ID. In "
2290 "addition, the I<sem_otime> is set to the current time."
2294 #: build/C/man2/semop.2:314
2296 "B<semtimedop>() behaves identically to B<semop>() except that in those "
2297 "cases where the calling thread would sleep, the duration of that sleep is "
2298 "limited by the amount of elapsed time specified by the I<timespec> structure "
2299 "whose address is passed in the I<timeout> argument. (This sleep interval "
2300 "will be rounded up to the system clock granularity, and kernel scheduling "
2301 "delays mean that the interval may overrun by a small amount.) If the "
2302 "specified time limit has been reached, B<semtimedop>() fails with I<errno> "
2303 "set to B<EAGAIN> (and none of the operations in I<sops> is performed). If "
2304 "the I<timeout> argument is NULL, then B<semtimedop>() behaves exactly like "
2309 #: build/C/man2/semop.2:324
2311 "If successful B<semop>() and B<semtimedop>() return 0; otherwise they "
2312 "return -1 with I<errno> indicating the error."
2316 #: build/C/man2/semop.2:328
2317 msgid "On failure, I<errno> is set to one of the following:"
2321 #: build/C/man2/semop.2:328
2327 #: build/C/man2/semop.2:336
2329 "The argument I<nsops> is greater than B<SEMOPM>, the maximum number of "
2330 "operations allowed per system call."
2334 #: build/C/man2/semop.2:343
2336 "The calling process does not have the permissions required to perform the "
2337 "specified semaphore operations, and does not have the B<CAP_IPC_OWNER> "
2342 #: build/C/man2/semop.2:352
2344 "An operation could not proceed immediately and either B<IPC_NOWAIT> was "
2345 "specified in I<sem_flg> or the time limit specified in I<timeout> expired."
2349 #: build/C/man2/semop.2:359
2351 "An address specified in either the I<sops> or the I<timeout> argument isn't "
2356 #: build/C/man2/semop.2:359
2362 #: build/C/man2/semop.2:365
2364 "For some operation the value of I<sem_num> is less than 0 or greater than or "
2365 "equal to the number of semaphores in the set."
2369 #: build/C/man2/semop.2:372
2371 "While blocked in this system call, the thread caught a signal; see "
2376 #: build/C/man2/semop.2:379
2378 "The semaphore set doesn't exist, or I<semid> is less than zero, or I<nsops> "
2379 "has a nonpositive value."
2383 #: build/C/man2/semop.2:387
2385 "The I<sem_flg> of some operation specified B<SEM_UNDO> and the system does "
2386 "not have enough memory to allocate the undo structure."
2390 #: build/C/man2/semop.2:395
2392 "For some operation I<sem_op+semval> is greater than B<SEMVMX>, the "
2393 "implementation dependent maximum value for I<semval>."
2397 #: build/C/man2/semop.2:395
2403 #: build/C/man2/semop.2:402
2405 "B<semtimedop>() first appeared in Linux 2.5.52, and was subsequently "
2406 "backported into kernel 2.4.22. Glibc support for B<semtimedop>() first "
2407 "appeared in version 2.3.3."
2411 #: build/C/man2/semop.2:426
2413 "The I<sem_undo> structures of a process aren't inherited by the child "
2414 "produced by B<fork>(2), but they are inherited across an B<execve>(2) "
2419 #: build/C/man2/semop.2:432
2421 "B<semop>() is never automatically restarted after being interrupted by a "
2422 "signal handler, regardless of the setting of the B<SA_RESTART> flag when "
2423 "establishing a signal handler."
2427 #: build/C/man2/semop.2:447
2429 "I<semadj> is a per-process integer which is simply the (negative) count of "
2430 "all semaphore operations performed specifying the B<SEM_UNDO> flag. When a "
2431 "semaphore's value is directly set using the B<SETVAL> or B<SETALL> request "
2432 "to B<semctl>(2), the corresponding I<semadj> values in all processes are "
2437 #: build/C/man2/semop.2:452
2439 "The I<semval>, I<sempid>, I<semzcnt>, and I<semnct> values for a semaphore "
2440 "can all be retrieved using appropriate B<semctl>(2) calls."
2444 #: build/C/man2/semop.2:456
2445 msgid "The following limits on semaphore set resources affect the B<semop>() call:"
2449 #: build/C/man2/semop.2:456
2454 #. This /proc file is not available in Linux 2.2 and earlier -- MTK
2456 #: build/C/man2/semop.2:464
2458 "Maximum number of operations allowed for one B<semop>() call (32) (on "
2459 "Linux, this limit can be read and modified via the third field of "
2460 "I</proc/sys/kernel/sem>)."
2464 #: build/C/man2/semop.2:469
2465 msgid "Maximum allowable value for I<semval>: implementation dependent (32767)."
2469 #: build/C/man2/semop.2:476
2471 "The implementation has no intrinsic limits for the adjust on exit maximum "
2472 "value (B<SEMAEM>), the system wide maximum number of undo structures "
2473 "(B<SEMMNU>) and the per-process maximum number of undo entries system "
2478 #: build/C/man2/semop.2:497
2480 "When a process terminates, its set of associated I<semadj> structures is "
2481 "used to undo the effect of all of the semaphore operations it performed with "
2482 "the B<SEM_UNDO> flag. This raises a difficulty: if one (or more) of these "
2483 "semaphore adjustments would result in an attempt to decrease a semaphore's "
2484 "value below zero, what should an implementation do? One possible approach "
2485 "would be to block until all the semaphore adjustments could be performed. "
2486 "This is however undesirable since it could force process termination to "
2487 "block for arbitrarily long periods. Another possibility is that such "
2488 "semaphore adjustments could be ignored altogether (somewhat analogously to "
2489 "failing when B<IPC_NOWAIT> is specified for a semaphore operation). Linux "
2490 "adopts a third approach: decreasing the semaphore value as far as possible "
2491 "(i.e., to zero) and allowing process termination to proceed immediately."
2495 #. http://marc.theaimsgroup.com/?l=linux-kernel&m=110260821123863&w=2
2497 #. http://marc.theaimsgroup.com/?l=linux-kernel&m=110261701025794&w=2
2499 #: build/C/man2/semop.2:506
2501 "In kernels 2.6.x, x E<lt>= 10, there is a bug that in some circumstances "
2502 "prevents a thread that is waiting for a semaphore value to become zero from "
2503 "being woken up when the value does actually become zero. This bug is fixed "
2508 #: build/C/man2/semop.2:511
2510 "The following code segment uses B<semop>() to atomically wait for the value "
2511 "of semaphore 0 to become zero, and then increment the semaphore value by "
2516 #: build/C/man2/semop.2:515
2519 " struct sembuf sops[2];\n"
2524 #: build/C/man2/semop.2:517
2526 msgid " /* Code to set I<semid> omitted */\n"
2530 #: build/C/man2/semop.2:521
2533 " sops[0].sem_num = 0; /* Operate on semaphore 0 */\n"
2534 " sops[0].sem_op = 0; /* Wait for value to equal 0 */\n"
2535 " sops[0].sem_flg = 0;\n"
2539 #: build/C/man2/semop.2:525
2542 " sops[1].sem_num = 0; /* Operate on semaphore 0 */\n"
2543 " sops[1].sem_op = 1; /* Increment value by one */\n"
2544 " sops[1].sem_flg = 0;\n"
2548 #: build/C/man2/semop.2:530
2551 " if (semop(semid, sops, 2) == -1) {\n"
2552 " perror(\"semop\");\n"
2553 " exit(EXIT_FAILURE);\n"
2558 #: build/C/man2/semop.2:540
2560 "B<clone>(2), B<semctl>(2), B<semget>(2), B<sigaction>(2), "
2561 "B<capabilities>(7), B<sem_overview>(7), B<svipc>(7), B<time>(7)"