2

新しいメッセージ キューを取得するために msgget() syscall を使用しています。その中で IPC_CREAT & IPC_EXCL フラグを使用しました。今、私 message_queue = msgget(ftok("/tmp", 100), (0666 | IPC_CREAT | IPC_EXCL)); のプログラムが予期せず存在すると、メッセージキューが残り、メッセージキューの再作成に失敗しました。それで、私の質問は「どうすれば既存の msg キューの ID を取り戻すことができますか?」です。

ところで、msg キューはその ID をどこに保存しますか?

4

3 に答える 3

2

Regd "既存のメッセージ キューの ID を取得するにはどうすればよいですか?"

man msgget から

   If  msgflg  specifies both IPC_CREAT and IPC_EXCL and a message queue already exists for key, then msgget() fails with errno set to EEX-
   IST.  (This is analogous to the effect of the combination O_CREAT | O_EXCL for open(2).)

IPC_EXCL フラグなしで試してください。

登録 メッセージキューはそのIDをどこに保存しますか

マンプロセスから

   /proc/sysvipc
          Subdirectory  containing  the  pseudo-files  msg,  sem  and  shm.  These files list the System V Interprocess Communication (IPC)
          objects (respectively: message queues, semaphores, and shared memory) that currently  exist  on  the  system,  providing  similar
          information  to that available via ipcs(1).  These files have headers and are formatted (one IPC object per line) for easy under-
          standing.  svipc(7) provides further background on the information shown by these files.
于 2012-04-05T07:43:48.423 に答える
1

以下は、質問への回答の試みです。役立つ場合は、クレジットはThe Linux Programmer's Guideに移動する必要があります。それが無関係か何かであると特定された場合、間違いはすべて私のものです。

ipcs コマンドを使用して、すべての System V IPC オブジェクトのステータスを取得できます。

ipcs -q: Show only message queues
ipcs -s: Show only semaphores
ipcs -m: Show only shared memory
ipcs --help: Additional arguments

ipcrm コマンドを使用して、カーネルから IPC オブジェクトを削除できます。IPC オブジェクトはユーザー コードのシステム コールを介して削除できますが (方法については後で説明します)、特に開発環境では、IPC オブジェクトを手動で削除する必要が生じることがよくあります。

使い方は簡単です:

ipcrm <msg | sem | shm> <IPC ID>
于 2012-09-18T17:10:13.320 に答える
0

2 回目にメッセージ キューを再作成しようとしないでください。IPC_CREAT | IPC_EXCL2回目のご使用はmsgget故障の原因となります。

msggetのmanページから

msgflgがIPC_CREATIPC_EXCLの両方を指定し、キーのメッセージ キューが既に存在する場合、msgget ( ) は失敗し、errnoがEEXISTに設定されます。(これは、 open (2) に対するO_CREAT | O_EXCLの組み合わせの効果に類似しています。)

したがって、2 回目も引き続き使用できますが、フラグmsggetのみを使用してください。また、とIPC_CREATの両方の戻り値を確認し、エラー値がある場合はマニュアル ページと比較してください。もチェックしてください。ftokmsggeterrno

また、既存のメッセージ キューに問題がある場合は、フラグmsgctlとともに呼び出すことで削除できます。IPC_RMID

また、msg キューが格納されている場所に関する他の回答。問題のある msg キューを削除したくなるかもしれません :) しかし、注意してください、それらは仮想ファイル システム /proc に置かれている読み取り専用のファイルです!

于 2012-04-05T07:40:43.570 に答える