Rechercher une page de manuel
sem_wait
Langue: ja
Version: 2006-03-25 (openSuse - 09/10/07)
Section: 3 (Bibliothèques de fonctions)
̾Á°
sem_wait, sem_timedwait, sem_trywait - ¥»¥Þ¥Õ¥©¤ò¥í¥Ã¥¯¤¹¤ë½ñ¼°
#include <semaphore.h> int sem_wait(sem_t *sem); int sem_trywait(sem_t *sem); #define _XOPEN_SOURCE 600 #include <semaphore.h> int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
ÀâÌÀ
sem_wait() ¤Ï sem ¤¬»Ø¤¹¥»¥Þ¥Õ¥©¤ÎÃͤò 1 ¸º¤é¤¹ (¥í¥Ã¥¯¤¹¤ë)¡£ ¥»¥Þ¥Õ¥©¤ÎÃͤ¬ 0 ¤è¤êÂ礤¤¾ì¹ç¡¢¸º»»¤¬¼Â¹Ô¤µ¤ì¡¢´Ø¿ô¤Ïľ¤Á¤ËÉüµ¢¤¹¤ë¡£ ¥»¥Þ¥Õ¥©¤Î¸½ºßÃͤ¬ 0 ¤Î¾ì¹ç¤Ë¤Ï¡¢¸º»»¤ò¼Â¹Ô¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ë (¤Ä¤Þ¤ê¡¢¥»¥Þ¥Õ¥©¤ÎÃͤ¬ 0 ¤è¤êÂ礤ÊÃͤˤʤë) ¤Þ¤Ç¡¢¤â¤·¤¯¤Ï ¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ë¤è¤Ã¤Æ¸Æ¤Ó½Ð¤·¤¬ÃæÃǤµ¤ì¤ë¤Þ¤Ç¡¢ ´Ø¿ô¸Æ¤Ó½Ð¤·¤ÏÄä»ß (block) ¤¹¤ë¡£sem_trywait() ¤Ï sem_wait() ¤ÈƱ¤¸¤À¤¬¡¢¥»¥Þ¥Õ¥©Ãͤθº»»¤ò¤¹¤°¤Ë¼Â¹Ô¤Ç¤¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¡¢ Ää»ß (block) ¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¥¨¥é¡¼¤ÇÉüµ¢¤¹¤ë (errno ¤Ë EAGAIN ¤¬¥»¥Ã¥È¤µ¤ì¤ë) ÅÀ¤¬°Û¤Ê¤ë¡£
sem_timedwait() ¤Ï sem_wait() ¤ÈƱ¤¸¤À¤¬¡¢¥»¥Þ¥Õ¥©Ãͤθº»»¤ò¤¹¤°¤Ë¼Â¹Ô¤Ç¤¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë ´Ø¿ô¸Æ¤Ó½Ð¤·¤¬Ää»ß¤¹¤ë»þ´Ö¤Î¾å¸Â¤ò abs_timeout ¤Ç»ØÄꤹ¤ëÅÀ¤¬°Û¤Ê¤ë¡£ abs_timeout °ú¤¿ô¤Ï¡¢¥¿¥¤¥à¥¢¥¦¥È»þ¹ï¤ò»ØÄꤹ¤ë¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¤Ç¤¢¤ë¡£ ¤³¤Î¹½Â¤ÂΤˤϡ¢¥¿¥¤¥à¥¢¥¦¥È»þ¹ï¤ò»þ¹ïµª¸µ (Epoch; 1970 ǯ 1 ·î 1 Æü 00:00:00) ¤«¤é¤Î·Ð²á»þ´Ö (ÉáܥʥÎÉÃ) ¤Ç»ØÄꤹ¤ë¡£ ¹½Â¤ÂΤϰʲ¼¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë:
struct timespec { time_t tv_sec; /* Seconds */ long tv_nsec; /* Nanoseconds [0 .. 999999999] */ };
´Ø¿ô¸Æ¤Ó½Ð¤·»þÅÀ¤Ç¤¹¤Ç¤Ë¥¿¥¤¥à¥¢¥¦¥È¤Ë»ØÄꤷ¤¿»þ¹ï¤¬²á¤®¤Æ¤ª¤ê¡¢ ¤«¤Ä¥»¥Þ¥Õ¥©¤ò¤¹¤°¤Ë¥í¥Ã¥¯¤Ç¤¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢ sem_timedwait() ¤Ï¥¿¥¤¥à¥¢¥¦¥È¥¨¥é¡¼ (errno ¤Ë ETIMEDOUT ¤¬¥»¥Ã¥È¤µ¤ì¤ë) ¤Ç¼ºÇÔ¤¹¤ë¡£
¥»¥Þ¥Õ¥©Áàºî¤¬¤¹¤°¤Ë¼Â¹Ô¤Ç¤¤ë¤È¤¤Ï¡¢ abs_timeout ¤¬¤É¤ó¤ÊÃͤǤ¢¤Ã¤Æ¤â sem_timedwait() ¤¬¼ºÇÔ¤¹¤ë¤³¤È¤Ï·è¤·¤Æ¤Ê¤¤¡£¤µ¤é¤Ë¤¤¤¦¤È¡¢¤³¤Î¾ì¹ç¤Ë¤Ï abs_timeout ¤ÎÀµÅöÀ¤Î¸¡ºº¤Ï¹Ô¤ï¤ì¤Ê¤¤¡£
ÊÖ¤êÃÍ
À®¸ù¤¹¤ë¤È¡¢¤³¤ì¤é¤Î´Ø¿ô¤Ï 0 ¤òÊÖ¤¹¡£ ¥¨¥é¡¼¤Î¾ì¹ç¡¢¥»¥Þ¥Õ¥©¤ÎÃͤòÊѹ¹¤»¤º¤Ë¡¢-1 ¤òÊÖ¤·¡¢ errno ¤Ë¥¨¥é¡¼¤ò¼¨¤¹Ãͤò¥»¥Ã¥È¤¹¤ë¡£¥¨¥é¡¼
- EINTR
- ¸Æ¤Ó½Ð¤·¤Ï¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ë¤è¤êÃæÃǤµ¤ì¤¿¡£
- EINVAL
- sem ¤Ï͸ú¤Ê¥»¥Þ¥Õ¥©¤Ç¤Ê¤¤¡£
sem_trywait() ¤Î¾ì¹ç¤Ë¤Ï¡¢¾åµ¤Ë²Ã¤¨¤Æ°Ê²¼¤Î¥¨¥é¡¼¤âµ¯¤³¤ë¡£
- EAGAIN
- Ää»ß (block) ¤»¤º¤Ë¥í¥Ã¥¯Áàºî¤ò´°Î»¤Ç¤¤Ê¤«¤Ã¤¿ (¤Ä¤Þ¤ê¡¢ ¥»¥Þ¥Õ¥©¤Î¸½ºß¤ÎÃͤ¬ 0 ¤Ç¤¢¤Ã¤¿)¡£
sem_timedwait() ¤Î¾ì¹ç¡¢°Ê²¼¤Î¥¨¥é¡¼¤âµ¯¤³¤ë¡£
- EINVAL
- abs_timeout.tv_nsecs ¤ÎÃͤ¬ 0 ̤Ëþ¡¢¤â¤·¤¯¤Ï 1,000,000,000 °Ê¾å¤Ç¤¢¤ë¡£
- ETIMEDOUT
- ¥»¥Þ¥Õ¥©¤Î¥í¥Ã¥¯¤ËÀ®¸ù¤¹¤ëÁ°¤Ë»þ´ÖÀÚ¤ì¤È¤Ê¤Ã¤¿¡£ POSIX.1-2001.
Ãí°Õ
¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ï¡¢ sigaction(2) ¤Î SA_RESTART ¥Õ¥é¥°¤ò»ÈÍѤ·¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë´Ø¤ï¤é¤º¡¢¤³¤ì¤é¤Î´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤¬ Ää»ß¤·¤Æ¤¤¤ë¾ì¹ç¡¢¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ë¤è¤ê¾ï¤ËÃæÃǤµ¤ì¤ë¡£Îã
°Ê²¼¤Ë¼¨¤¹ (¤Á¤ç¤Ã¤È¤·¤¿) ¥×¥í¥°¥é¥à¤Ï̾Á°¤Ê¤·¥»¥Þ¥Õ¥©¤ÎÁàºî¤ò¹Ô¤¦¡£ ¥×¥í¥°¥é¥à¤Ï¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¤¿ô¤ò 2 ¤Ä¼è¤ë¡£ ºÇ½é¤Î°ú¤¿ô¤Ë¤Ï¡¢ SIGALRM ¥·¥°¥Ê¥ë¤òÀ¸À®¤¹¤ë¤¿¤á¤Î¥¢¥é¡¼¥à¥¿¥¤¥Þ¡¼¤ÎÀßÄê¤Ë»È¤ï¤ì¤ëÃͤò ÉÃñ°Ì¤Ç»ØÄꤹ¤ë¡£¤³¤Î¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é¤Ï¡¢ main() Æâ¤Ç sem_timedwait() ¤ò»È¤Ã¤ÆÂԤäƤ¤¤ë¥»¥Þ¥Õ¥©¤ò¡¢ sem_post(3) ¤ò»È¤Ã¤Æ²Ã»»¤¹¤ë¡£ 2ÈÖÌܤΰú¤¿ô¤Ë¤Ï¡¢ sem_timedwait() ¤ËÅϤ¹¥¿¥¤¥à¥¢¥¦¥È¤Þ¤Ç¤Î»þ´Ö¤òÉÃñ°Ì¤Ç»ØÄꤹ¤ë¡£
$ ./a.out 2 3 About to call sem_timedwait() sem_post() from handler sem_getvalue() from handler; value = 1 sem_timedwait() succeeded $ ./a.out 2 1 About to call sem_timedwait() sem_timedwait() timed out
¥×¥í¥°¥é¥à¤Î¥½¡¼¥¹¥³¡¼¥É¤Ï°Ê²¼¤ÎÄ̤ê¤Ç¤¢¤ë:
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <semaphore.h> #include <time.h> #include <assert.h> #include <errno.h> #include <signal.h> #define die(msg) { perror(msg); exit(EXIT_FAILURE); } sem_t sem; static void handler(int sig) { int sval; printf("sem_post() from handler\n"); if (sem_post(&sem) == -1) die("sem_post"); if (sem_getvalue(&sem, &sval) == -1) die("sem_getvalue"); printf("sem_getvalue() from handler; value = %d\n", sval); } /* handler */ int main(int argc, char *argv[]) { struct sigaction sa; struct timespec ts; int s; assert(argc == 3); /* Usage: ./a.out alarm-secs wait-secs */ if (sem_init(&sem, 0, 0) == -1) die("sem_init"); /* Establish SIGALRM handler; set alarm timer using argv[1] */ sa.sa_handler = handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGALRM, &sa, NULL) == -1) die("sigaction"); alarm(atoi(argv[1])); /* Calculate relative interval as current time plus number of seconds given argv[2] */ if (clock_gettime(CLOCK_REALTIME, &ts) == -1) die("clock_gettime"); ts.tv_sec += atoi(argv[2]); printf("main() about to call sem_timedwait()\n"); while ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR) continue; /* Restart when interrupted by handler */ /* Check what happened */ if (s == -1) { if (errno == ETIMEDOUT) printf("sem_timedwait() timed out\n"); else die("sem_timedwait"); } else printf("sem_timedwait() succeeded\n"); exit(EXIT_SUCCESS); }
´ØÏ¢¹àÌÜ
sem_getvalue(3), sem_post(3), feature_test_macros(7), sem_overview(7)Contenus ©2006-2024 Benjamin Poulain
Design ©2006-2024 Maxime Vantorre