套接字发送失败会导致守护程序崩溃吗?

时间:2015-04-23 09:48:08

标签: c linux sockets unix

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

1 个答案:

答案 0 :(得分:0)

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

假设您的代码如下所示:

,而(1) {     connfd = accept(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”或执行核心文件分析以了解它崩溃的原因。