[FreeBSD] POSIX semaphoreとlibpthread

POSIX semaphoreのsem_initのテストをしようとしてまず以下のようなプログラムを書いてコンパイル、実行した。

#include <stdio.h>
#include <errno.h>
#include <semaphore.h>
sem_t *p;
sem_t s;
main()
{
    p = &s;
    if (sem_init(p, 0, 1) < 0)
    {
        perror("sem_init gm_send_fifo_sem");
        return;
    }
    else
    {
         if (sem_wait(&s) < 0)
         {
             perror("gm fifo sem:creat and wait failed");
             return;
        }
     }
     sem_destroy(p);
}

これを、libcのみをリンクして実行する。

% cc a.c
% ./a.out
Bad System Call

というエラーを発生する。
これを実行するためには libpthreadをリンクする必要がある。

% cc -lpthread a.c
% ./a.out

通常、semaphoreでの待ち合わせが必要な状況は、threadを使っていることが多いため、自然にこのエラーを回避している。エラーを経験するのはテストプログラムのようにthreadなしで呼ぶときだけだろう。

広告
%d人のブロガーが「いいね」をつけました。