【问题标题】:Can socket send fail cause a daemon program crash?套接字发送失败会导致守护程序崩溃吗?
【发布时间】:2015-04-23 09:48:07
【问题描述】:

我在嵌入式 Linux 板上运行了两个应用程序。一个作为守护进程运行,另一个作为它的接口。它们使用 Unix 套接字相互通信。 至于处理套接字的任何异常终止,我尝试终止接口应用程序[ctr+c]。但结果,守护程序应用程序崩溃。由于套接字已终止,我在守护程序端收到套接字发送失败错误,这是预期的,但之后守护程序崩溃。 我不知道我应该在哪里寻找调试这个问题。

【问题讨论】:

  • 在 Socket send failed 错误后,您是否检查过您没有使用套接字。因为到那时套接字将无效。

标签: c linux sockets unix


【解决方案1】:

您是否将守护程序中的套接字设置为非阻塞模式?

假设您的代码如下所示:

当(1) { connfd = 接受(listenfd, (struct sockaddr*)NULL, NULL);

/* then you use the fd */

func(connfd);   

}

根据手册页:

" 成功时,accept() 返回一个非负整数,它是已接受套接字的描述符。出错时,返回 -1,并正确设置 errno。

如果队列中没有挂起的连接,并且套接字没有被标记为非阻塞,accept() 会阻塞调用者,直到连接出现。如果套接字被标记为非阻塞并且队列中没有挂起的连接,accept() 将失败并返回 EAGAIN 或 EWOULDBLOCK 错误。 "

因此,这意味着如果你在非阻塞模式下,你应该检查accept()的返回值而不是直接使用它,因为fd值会是-1。

以上只是一种常见的可能性。如果不是这样,可以尝试使用“sudo strace -p process_id”或进行核心文件分析,了解崩溃的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多