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ページや他のいくつかのWebサイトと同じように共用体を宣言し、後でsemget()セマフォが返されることを確認して、その部分が正しく機能していることを確認しています。誰かが私が間違っている場所を教えてくれたら、とても感謝しています。

また、誰かが私の間違いから学ぶことができるように、私のエラーの背後にある理由を説明していただければ、それが最も役立つでしょう.

ありがとう

更新:どうやらそれが気に入らなかった== -1ので、に変更したところ< 0、うまく機能しましたが、すべての応答に感謝します

4

1 に答える 1

2

semIdへの呼び出しの前に初期化を怠った可能性がありますsemctl()

以下を追加してみてください:

int semId = -1;

...

semId = semget(IPC_PRIVATE, 1, IPC_CREAT);
if (-1 == semId)
   perror("semget() failed");
else {
/* Your call to semctl() */
}
于 2012-03-03T09:14:53.117 に答える