私は現在、プロセスとプロセス間通信に精通するためにWebサーバーをコーディングしています。ファイルが要求されると、読み取り/書き込み中にファイルが変更されないようにロックします。それはうまくいきます。私の問題は、デーモン プロセスの実行が終了した後にメモリからロックをクリアする方法です。セマフォを作成したプロセスが実行を停止した後も、セマフォは残っていることを私は知っています。親でセマフォの破棄を行う必要があることは知っていますが、セマフォは子で作成され、親には参照がありません。基本的には、次のようになります。子プロセス中に作成されたセマフォを参照して、デーモンが停止したときに終了ハンドラーでセマフォを破棄できるようにする方法はありますか? 私はしません これを行う方法について本当に途方に暮れているため、共有するコードはありません。Linux システムで C でコーディングしています。助けてくれてありがとう!
1 に答える
0
SemId = semget(IPC_PRIVATE, n, 0600);
あなたは間違いなくこれを使ってセマフォを作成しています。ここで、n
はセマフォの数です。
SemId
共有メモリに含めることができます。
これにより、親のセマフォをクリアできます。
グローバル変数の作成と親でのセマフォの取得、または共有メモリでの変数の使用を避けたい場合は、子を終了する前に、必ず次を使用できます。
semctl(SemId, 0, IPC_RMID, 0);
共有メモリは親で実行する必要があり、次を使用して実行できます。
ID = shmget(IPC_PRIVATE, sizeof(int) * X, 0600);
共有メモリのサイズは間違いなくあなたの選択です。
SemId = (int *) shmat(ID, NULL, 0);
これは、のスペースに起因しますSemId
。子を終了した後、親(または他の子)はこの変数にアクセスし、semctl
上記を使用してセマフォを削除できます。
int *SemID
グローバル変数として宣言する必要があります。
したがって、セマフォを作成する場合は、関数を使用すると、その値を上記semget
のように戻すことができます。SemId
共有メモリオプションを使用する場合は、以下を使用してそのメモリの属性付きスペースを削除することを忘れないでください。
shmdt((void *) SemId);
shmctl(ID, IPC_RMID, NULL);
于 2012-11-14T22:21:22.557 に答える