我有两个应用程序在嵌入式 Linux 板上运行。一个作为守护进程运行,另一个充当它的接口(interface)。他们使用 Unix 套接字相互通信。 为了处理套接字的任何异常终止,我尝试终止接口(interface)应用程序[ctr+c]。但结果是,守护程序应用程序崩溃了。由于套接字已终止,我在守护进程端收到套接字发送失败错误,这是预期的,但之后守护进程崩溃了。 我不知道到底应该在哪里寻找调试这个问题。
最佳答案
您是否已将守护程序中的套接字设置为非阻塞模式?
假设您的代码如下所示:
同时(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”或进行核心文件分析来了解崩溃的原因。
关于套接字发送失败会导致守护程序崩溃吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29819734/