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

Yamamoto email@hidden
2013年 4月 9日 (火) 17:47:49 JST


Yamamotoです。

有難う御座いました。

先ほど原因が判明しました。

> 	        if (mtype < 1)
> 	                return -EINVAL;

mtypeに何も設定していなかったので、デフォルトで0が入っている時にエラーになってい
ました。

お騒がせしました。

On Tue, 09 Apr 2013 17:38:23 +0900
Yasushi SHOJI <email@hidden> wrote:

> 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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
> 





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