2012-05-02 14 views
3

今私は自分のプロジェクトに取り組んでおり、セマフォの初期化について質問があります。実際に私はMac OS Xでプログラミングしていますが、私はLinuxでプロジェクトをコンパイルしようとしましたが、コンパイルはしません。 OS Xでは、初期化の瞬間にコンパイルするたびにクラッシュします。セマフォの使用に関するいくつかの問題

sem_t *mutex_1, *mutex_2, *mutex_3, *reader, *writer; 

int initialization_semaphores (void) 
{ 
    int ERROR = EOK; 
    if ((mutex_1 = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED) 
     ERROR = ESEM; 
    if ((mutex_2 = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED) 
     ERROR = ESEM; 
    if ((mutex_3 = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED) 
     ERROR = ESEM; 
    if ((reader = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED) 
     ERROR = ESEM; 
    if ((writer = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED) 
     ERROR = ESEM; 

    if (ERROR == EOK) { 
     if (sem_init(mutex_1, 1, 1) == -1) 
      ERROR = ESEM; 
     if (sem_init(mutex_2, 1, 1) == -1) 
      ERROR = ESEM; 
     if (sem_init(mutex_3, 1, 1) == -1) 
      ERROR = ESEM; 
     if (sem_init(reader, 1, 1) == -1) 
      ERROR = ESEM; 
     if (sem_init(writer, 1, 1) == -1) 
      ERROR = ESEM; 
    } 
} 

私はLinux上でそれをコンパイルしようとしたとき、私はこれを参照してください。

/tmp/ccmkN9G7.o: In function `initialization_semaphores': 
readerWriter.c:(.text+0x1a2): undefined reference to `sem_init' 
readerWriter.c:(.text+0x1cb): undefined reference to `sem_init' 
readerWriter.c:(.text+0x1f4): undefined reference to `sem_init' 
readerWriter.c:(.text+0x21d): undefined reference to `sem_init' 
readerWriter.c:(.text+0x246): undefined reference to `sem_init' 
readerWriter.c:(.text+0x275): undefined reference to `shm_open' 

はそれが正しいですか? :

int ERROR = EOK; 
mutex_1 = sem_open("mutex1", O_CREAT, S_IRUSR | S_IWUSR, 1); 
mutex_2 = sem_open("mutex2", O_CREAT, S_IRUSR | S_IWUSR, 1); 
mutex_3 = sem_open("mutex3", O_CREAT, S_IRUSR | S_IWUSR, 1); 
reader = sem_open("reader", O_CREAT, S_IRUSR | S_IWUSR, 1); 
writer = sem_open("writer", O_CREAT, S_IRUSR | S_IWUSR, 1); 
+0

「int」を返すと宣言されていても、関数から値を返さないことに注意してください。これは警告を発しているはずです。他の警告が役立つ可能性がありますか? (R ..は常に正しいとはいえ、エラーや警告では何かが啓蒙されているかもしれません) – sarnold

+1

btw、コメントではエラーと警告はほぼ不可能です。 [編集]ポストは多分良いでしょう。 :) – sarnold

+0

私は関数の値を返しましたが、実際にはここにすべての関数を貼り付けませんでした。 – nikigx2

答えて

5

Mac OSXは準拠していないため、sem_initをサポートしていません。この関数は存在しますが、暗黙のうちに失敗したり悪化したりして、動作していないセマフォを残します。

Appleのバグを報告することをお勧めします。これは、アプリケーションの移植性に悪影響を及ぼしている本当の、長年にわたる問題です。不平を言う人が多くなればなるほど、それを解決するという希望が増えます。その周りに作業用として

、あなたは/すべてのPOSIXセマフォ関数の代替実装を作成し、それにあなたのプログラムをリンク見つけることを試みること、またはあなたの代わりにmmapsem_initsem_openの使用に切り替えることができます。

(各セマフォのページ全体をマッピングするオーバーヘッドを既に済ませている限り、sem_openは実際には何も追加費用がかかりません。このバグは実際にはあなたのセマフォは既存のstructの中にあります。)

+2

うわーを得ています。それは...うわー。 – sarnold

0

Mac OSXの回避策があります。

#include <dispatch/dispatch.h> 

typedef dispatch_semaphore_t sem_t; 

void sem_init(sem_t* sem, bool is_pshared, unsigned value) 
{ 
    *sem = dispatch_semaphore_create(value); 
} 

static void sem_destroy(sem_t* sem) 
{ 
    dispatch_release(*sem); 
} 

static void sem_post(sem_t* sem) 
{ 
    dispatch_semaphore_signal(*sem); 
} 

static void sem_wait(sem_t* sem) 
{ 
    dispatch_semaphore_wait(*sem, DISPATCH_TIME_FOREVER); 
} 

しかし、私はsem_getvalue()を行う方法がわからない - 誰もが知っている場合、私に知らせてください。

関連する問題