3

プロセスが現在 SysV セマフォを使用している唯一のプロセスであるかどうかを判断し、何らかの方法でセマフォを「ロック」して、別のプロセスが再度アクセスを要求する前にプロセスがセマフォを安全に削除できるようにすることは可能ですか?

4

2 に答える 2

0
int a;



  if((a = semget(IPC_PRIVATE,1,0777|IPC_CREAT))==-1) {              // get semaphore a
           perror("\nFailed to create semaphore.");
           exit(0);
   }

   if((semctl(a,0,IPC_RMID,0))==-1) {                                // Return semaphore a 
           perror("\nCan't RPC_RMID.");                                             
           exit(0);                                                                                
    }
于 2013-01-29T12:42:13.523 に答える
0

私はあなたの質問に答えようとします。十分に正確でない場合は、お気軽に回答を編集 (またはコメント) してください。


まず第一に、セマフォはおおよそ単純な整数値です。プロセスが関数を介してそれを使用する場合、次のsemop()3 つの目標が考えられます。

  • その値を増やします (セマフォにリソースを解放または追加することを意味します)
  • その値を減らします (セマフォから一部のリソースを取得または削除することを意味します)
  • セマフォが値 0 になるのを待つ

セマフォ自体は、特定の時点でそれを使用している可能性のあるプロセスに関する情報を保持していません。

次に、システム全体の「ロック」メカニズムを作成する方法はありません。

man ページによるとsemop()、すべての特権プロセス (機能が付与されているCAP_IPC_OWNER) は、セマフォ セットで操作を実行できます。さらに、すべてのsemctl()コマンドは、特権プロセス (を含むIPC_RMID) で使用できます。

これは、コードがそのような風変わりなケースに備えなければならず、結果として生じるエラーを処理しなければならないことを意味します。たとえばipcrm -s <sem_id here>、特権ユーザーとしてコマンドを実行すると、いつでもセマフォ セットをすぐに削除できます。

于 2013-01-23T10:09:56.380 に答える