sem_wait

Autres langues

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)