セマフォを*作成*するときにsemget()がEACCESエラーを引き起こすのはなぜですか?

私はC ++プロジェクト用のセマフォー配列を作る必要があります。私は main()から
semget()を呼び出すことはありません。 main.cpp
のメソッドではあるが、簡単にするための別の方法がある。私のプログラムが semget(semkey、nsems、0666
| IPC_CREAT)
に到達すると、EACCES errnoで-1を返します。これは明らかに ”
key semflg の下位9ビットで指定された操作許可は与えられません。

I’ve gone over and over my code with GDB. All three parameters
for semget() look right, and this is the first point
at which the program call semget(), so the semaphore
doesn’t exist already; I even ran ipcs -s to make
sure. I’ve got #include at the top of
main.cpp.

何が起きてる?私は既に共有メモリセグメントを作成して接続しました。これはそれと関係がありますか?どのように私は見ることができません。

ベストアンサー

マニュアルから:

 EACCES A semaphore set exists for key, but the calling process does not have permission to 
        access the set, and does not have the CAP_IPC_OWNER capability.

セマフォはシステムオブジェクトなので、システムコールが明示的に発行された場合にのみ削除されます。 (
IPC_RMID 、または ipcrm termコマンドを使用して)
semctl さらに、 semkey は一意である必要があります(たとえば、
ftok()関数から取得する必要があります)。 semget
。存在しているので、いわゆる EACCES
エラーが発生するので、すべてのプログラムがセマフォに対して0666権限を使用しているわけではありません。

リブートすると、次のように共有オブジェクトプール(セマフォ、共有メモリセグメント、メッセージキュー)がフラッシュされます。

#!/bin/bash
for i in `ipcs -s | cut -f 2 -d ' '`
do
   ipcrm -s $i
done

for i in `ipcs -m | cut -f 2 -d ' '`
do
   ipcrm -m $i
done

for i in `ipcs -q | cut -f 2 -d ' '`
do
   ipcrm -q $i
done

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です