[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 メーリングリストの案内