0

Mac でセマフォを使用しようとしていますが、開いているセマフォを閉じようとするとエラーが発生します。すべての初期化は成功しましたが、2 番目のセマフォを閉じようとしたときに、不正なファイル記述子エラーが返されました。

以下のコードは、open と close のラッパーです。

void init_sem(sem_t * s, char * sema_name, int value)
{
    if((s = sem_open(sema_name, O_CREAT, 0644, value)) == SEM_FAILED)
    {
        perror("sem_open");
        exit(1);
    }
    printf("init semaphore %s\n", sema_name);
}
void destroy_sem(sem_t * s, char * sema_name)
{
    printf("destroying, %s\n", sema_name);
    if (sem_close(s) == -1) {
        perror("sem_close");
        exit(EXIT_FAILURE);
    }

    if (sem_unlink(sema_name) == -1) {
        perror("sem_unlink");
        exit(EXIT_FAILURE);
    }
}

そしてmain.cで

sem_t * s, *a, *b;
init_sem(s, "/cs", 0);
init_sem(a, "/ps", 0);
init_sem(b, "/bs", 0);
destroy_sem(s, "/cs");
destroy_sem(a, "/ps"); //got error here
destroy_sem(b, "/bs");

なぜそれが機能しないのですか?

4

2 に答える 2

1

*sローカル変数になる場所を渡しています。値を代入すると、戻ったときに値が消えinit_semます。次に を呼び出すとdestroy_sim、初期化されていない値が に渡されますsem_close

から返される値を返す必要がありますsem_open

sem_t * init_sem(char * sema_name, int value)
{
    sem_t * s;
    if((s = sem_open(sema_name, O_CREAT, 0644, value)) == SEM_FAILED)
    {
        perror("sem_open");
        exit(1);
    }
    printf("init semaphore %s\n", sema_name);
    return s;
}

次に、次のように呼び出します。

s = init_sem("/cs", 0);
a = init_sem("/ps", 0);
b = init_sem("/bs", 0);
于 2013-02-12T21:43:19.503 に答える
0

ゲイブの答えは正しいです。

別の方法として、これを行うことができます:

void init_sem(sem_t ** s, char * sema_name, int value)
{
    if((*s = sem_open(sema_name, O_CREAT, 0644, value)) == SEM_FAILED)
    {
        perror("sem_open");
        exit(1);
    }
    printf("init semaphore %s\n", sema_name);
}
void destroy_sem(sem_t * s, char * sema_name)
{
    printf("destroying, %s\n", sema_name);
    if (sem_close(s) == -1) {
        perror("sem_close");
        exit(EXIT_FAILURE);
    }

    if (sem_unlink(sema_name) == -1) {
        perror("sem_unlink");
        exit(EXIT_FAILURE);
    }
}
int main (int argc, const char * argv[])
{
    sem_t * s, *a, *b;
    init_sem(&s, "/cs", 0);
    init_sem(&a, "/ps", 0);
    init_sem(&b, "/bs", 0);
    destroy_sem(s, "/cs");
    destroy_sem(a, "/ps");
    destroy_sem(b, "/bs");
}
于 2013-02-12T22:13:17.943 に答える