2012-04-05 7 views
2

新しいmsgキューを取得するには、msgget()syscallを使用しています。 IPC_CREAT & IPC_EXCLフラグを使用しています。 like message_queue = msgget(ftok("/tmp", 100), (0666 | IPC_CREAT | IPC_EXCL)); 私のprogが予期せず存在すると、msgキューが残り、msgキューを再作成できません。だから、私の質問は "私はどのように既存のmsgキューのIDを取り戻すことができますか?"既存のmsgキューIDを取り戻す方法

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

答えて

2

Regd "既存のmsgキューのIDを元に戻すにはどうすればいいですか?"

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フラグなしで試してみてくださいmsgget男から。

Regd。 MSGキューが男procを

/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. 
+0

返信のためのthnx ** user967552 **。とても役に立ちました。 – JohnG

0

メッセージキューを再作成しないでください。 IPC_CREAT | IPC_EXCLを2回使用すると、msggetは失敗します。 msgget

のmanページから

MSGFLGIPC_CREAT両方IPC_EXCLを指定し、メッセージキュー がすでにキーのために存在し、その後、msggetは()errnoにセットで失敗した場合〜EEXIST。 (これは組み合わせO_CREATの効果に類似しています。| O_EXCLオープン(2)のために)

だからあなたはまだmsgget秒の時間を使用し続けるが、唯一IPC_CREATフラグを使用することができます。 また、戻り値がftokmsggetであることを確認し、エラー値がある場合はマニュアルページで比較してください。 errnoもチェックしてください。既存のメッセージ・キューにあまりにも多くの問題がある場合は

また、あなたはMSGキューが保存されている場所へとIPC_RMIDフラグも

、他の答えと一緒にmsgctlを起動すると、それを削除することができます。あなたは厄介なmsgキューを削除するように誘惑されるかもしれません:)しかし、あなたが気にしているのは、それらは仮想ファイルシステム/ procに置かれた読み取り専用ファイルです!

+0

@JohnGうれしいが、それはジョンあなたを助けました! :) –

1

からそのID

を格納しないところ、次の質問にお答えしようとすると、それが有用である場合は、クレジットが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> 
関連する問題