本地socket,write时直接退出。。。。。。。。。。。。。。。。。。。

liuyang1943 2011-05-04 12:30:31
static mgmt_ipc_err_e iscsid_connect(int *fd)
{
int nsec;
struct sockaddr_un addr;

*fd = socket(AF_LOCAL, SOCK_STREAM, 0);
if (*fd < 0) {
log_error("can not create IPC socket (%d)!", errno);
return MGMT_IPC_ERR_ISCSID_NOTCONN;
}

memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_LOCAL;
memcpy((char *) &addr.sun_path + 1, ISCSIADM_NAMESPACE,
strlen(ISCSIADM_NAMESPACE));
/*
* Trying to connect with exponential backoff
*/
for (nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) {
if (connect(*fd, (struct sockaddr *) &addr, sizeof(addr)) == 0)
{
/* Connection established */
return MGMT_IPC_OK;
}


/* If iscsid isn't there, there's no sense
* in retrying. */
if (errno == ECONNREFUSED)
break;

/*
* Delay before trying again
*/
if (nsec <= MAXSLEEP/2)
sleep(nsec);
}
log_error("can not connect to iSCSI daemon (%d)!", errno);
return MGMT_IPC_ERR_ISCSID_NOTCONN;
}

mgmt_ipc_err_e iscsid_request(int *fd, iscsiadm_req_t *req)
{
int err;
err = iscsid_connect(fd);
if (err)
return err;
printf("function write is start!.\n");
printf("The fd =%d.\n",*fd);
printf("The req addr is %x.\n",req);
printf("sizeof(*req)=%d.\n",sizeof(*req));
if ((err = write(*fd, req, sizeof(*req))) != sizeof(*req)) { /**********这句直接退出*******//
log_error("got write error (%d/%d) on cmd %d, daemon died?",
err, errno, req->command);
close(*fd);
return MGMT_IPC_ERR_ISCSID_COMM_ERR;
}
return MGMT_IPC_OK;
}


上面是一个本地socket的代码,当执行到write函数时直接就退出了,我在write之前打印了相关参数信息都是正常的,为什么会退出呢?另外,系统环境是一个自己裁剪过的linux系统,不知道会不会跟这个有关系,难道write函数的执行出了一些so库还需要什么吗?
...全文
264 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ericming200409 2011-05-04
  • 打赏
  • 举报
回复
往socket写数据导致进程退出的很大可能是因为socket连接已不存在,导致产生SIGPIPE信号,而对这个信号的默认操作是退出进程,不知道你的问题是不是这个,光看你上面的代码看不出来
liuyang1943 2011-05-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nostopstep 的回复:]
sizeof(*req))) != sizeof(*req) 改为sizeof(iscsiadm_req_t))) != sizeof(iscsiadm_req_t)试一下.
[/Quote]
这个不是重点,字节数顶多影响write结果但不会导致write时直接退出吧。现在的问题是write时进程直接就退出了。。
nostopstep 2011-05-04
  • 打赏
  • 举报
回复
sizeof(*req))) != sizeof(*req) 改为sizeof(iscsiadm_req_t))) != sizeof(iscsiadm_req_t)试一下.
就想叫yoko 2011-05-04
  • 打赏
  • 举报
回复
*fd值正常不代表这个socket还是正常的
ericming200409 2011-05-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liuyang1943 的回复:]

引用 3 楼 ericming200409 的回复:
往socket写数据导致进程退出的很大可能是因为socket连接已不存在,导致产生SIGPIPE信号,而对这个信号的默认操作是退出进程,不知道你的问题是不是这个,光看你上面的代码看不出来

C/C++ code
printf("The fd =%d.\n",*fd);
printf("The req addr is %x.\……
[/Quote]
你只是用fd 和 req缓存了这个链接的信息,你自己没有去改变req的值,当然打印出来也会是正常的。但是TCP内部可能已经关闭了这个连接,所以还是要查看另外一段是不是没有关闭这个连接。
justkk 2011-05-04
  • 打赏
  • 举报
回复
是否有服务端在连接的另外一端等待读取?
liuyang1943 2011-05-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ericming200409 的回复:]
往socket写数据导致进程退出的很大可能是因为socket连接已不存在,导致产生SIGPIPE信号,而对这个信号的默认操作是退出进程,不知道你的问题是不是这个,光看你上面的代码看不出来
[/Quote]
 printf("The fd =%d.\n",*fd);
printf("The req addr is %x.\n",req);
printf("sizeof(*req)=%d.\n",sizeof(*req));
if ((err = write(*fd, req, sizeof(*req))) != sizeof(*req)) { /**********这句直接退出*******//
log_error("got write error (%d/%d) on cmd %d, daemon died?",
err, errno, req->command);
close(*fd);
return MGMT_IPC_ERR_ISCSID_COMM_ERR;
}

我在write前打印出了socket信息,一切正常,然后执行write函数就出错了,因此socket是存在的吧

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧