[Armadillo:08722] Re: msgsndでEINVALになることがある

Yasushi SHOJI email@hidden
2013年 4月 9日 (火) 17:38:23 JST


At Tue, 09 Apr 2013 10:02:17 +0900,
Yamamoto wrote:
> 
> 処理中でプロセンス間の通信用にメッセージキューを使用しようとしているのですが、時
> 々msgsndで-1エラーでerrno=EINVALになってしまうことがあります。
> 
> 確認用の単独動作の確認もしているのですが、上手く動作する時はまったくエラー発生せ
> ず。
> エラーが発生すると以降、ずっとエラーになります。

linux/ipc/msg.c::do_msgsnd() を見ると、

	long do_msgsnd(int msqid, long mtype, void __user *mtext,
	                size_t msgsz, int msgflg)
	{
	        struct msg_queue *msq;
	        struct msg_msg *msg;
	        int err;
	        struct ipc_namespace *ns;
	
	        ns = current->nsproxy->ipc_ns;
	
	        if (msgsz > ns->msg_ctlmax || (long) msgsz < 0 || msqid < 0)
		                return -EINVAL;
	        if (mtype < 1)
	                return -EINVAL;
	
	        msg = load_msg(mtext, msgsz);
	        if (IS_ERR(msg))
	                return PTR_ERR(msg);
	
	        msg->m_type = mtype;
	        msg->m_ts = msgsz;
	
	        msq = msg_lock_check(ns, msqid);
	        if (IS_ERR(msq)) {
	                err = PTR_ERR(msq);
	                goto out_free;
	        }
	   :
	   :

こんな感じでエラーにしています。man page に書いてあるのとあまり変らない
ですね...。

ここからは、勘ですが queue が別プロセスで消されているってことはないです
か? msgsnd() に失敗したときに、msgctl() を使って IPC_INFOや、MSG_INFO、
MSG_STAT を試すと、どうなります?
-- 
          yashi




armadillo メーリングリストの案内