2011-11-13 13 views
1

私はC++プロジェクト用のセマフォ配列を作る必要があります。私はsemget()main()から呼び出していません。 main.cppのメソッドでも、簡単にするための別の方法があります。プログラムがsemget(semkey,nsems,0666|IPC_CREAT)に達すると、明らかに "keyのセマフォー識別子が存在しますが、semflgの下位9ビットで指定された操作許可は与えられません"という意味のEACCES errnoで-1を返します。セマフォを*作成*するときにsemget()がEACCESエラーを引き起こすのはなぜですか?

GDBでコードを繰り返し実行しました。 semget()の3つのパラメータはすべて正しく見えますが、これはプログラムがsemget()を呼び出す最初のポイントなので、セマフォはすでに存在しません。私は確かにipcs -sを実行しました。私は#include <sys/sem.h>main.cppの先頭に持っています。

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

+0

それが正しく再起動後初めて動作しますか? –

+0

私は試していません。それはそれに影響します。どうして? –

+0

さて、 'ipcs'でクリーンアップするのはやったはずですが、システムをリブートすると残っている共有リソース(セマフォ、共有メモリなど)はきれいにクリーンアップされます。 –

答えて

1

:リマインダーとして

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. 

、セマフォはシステムオブジェクトなので、システムコールが明示的にこのために発行された場合にのみ削除されます。 (semctlIPC_RMID、またはipcrm termコマンド)。 さらに、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 
関連する問題