2012-03-03 21 views
0

私は値を変更しようとしたセマフォを持っていますが、失敗します。 manのページを読んだ後、値が0より小さく、SETVALを使用すると失敗することがわかりました(私は初期化していませんでした)。しかし、私はperror()を呼び出すと、私はそれを初期化するときに私は "識別子を削除"取得します。 SETALLまたはその組合を指しているかどうかはわかりません。セマフォの初期化

私の初期化が次のようになります。

union semun argument; 
unsigned short values[1]; 
values[0] = 1; 
argument.array = values; 
int retVal; 

//INITIALIZE our semaphore 
if(retVal = semctl(semId, 0, SETALL, argument) == -1) 
{ 
    perror("semaphore INITIALIZATION failed\n"); 
    exit(1); 
} 

私は、manページやいくつかの他のウェブサイトのように私の組合を宣言しているので、私はそれを知っていると私はそれがセマフォを返すことを確認するsemget()後にチェックをしています部品が正しく機能しています。誰かが私がどこに間違っているか教えてもらえれば、私はそれを高く評価します。

誰かが私の誤りの背後にある理由を説明することができれば、間違いからそれが最も有用であることを知ることができます。

おかげ

UPDATE:どうやらそれは

+2

あなたが/ SysVのセマフォを必要としたい理由はありますか? POSIXセマフォは、一般にはるかに優れています(よりsanerなAPIであり、ユーザー空間で実装できるのではるかに高速です)。しかし、非常に強力ではなく、本当の古いシステムでは利用できないかもしれません。 –

+0

いつ、どのように 'semId'を設定しましたか? – alk

答えて

2

は、おそらくあなたが前にsemIdを初期化するために逃したものの== -1はそう本当に奇妙なの私は< 0にそれを変更し、それがうまく働いた私はすべての回答に感謝を知らない好きではなかったですsemctl()への呼び出し。

はfolliwingを追加しよう:

int semId = -1; 

... 

semId = semget(IPC_PRIVATE, 1, IPC_CREAT); 
if (-1 == semId) 
    perror("semget() failed"); 
else { 
/* Your call to semctl() */ 
}