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

标签 c linux sockets unix

我有两个应用程序在嵌入式 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/

相关文章:

c++ - 尽管 KEEPALIVE,TCP、recv 函数仍挂起

java - 通过socket java向多个客户端广播对象

python - 使用带有 zmq 和 python 的套接字通过 send_json 发送整数列表时出现奇怪的错误

c - 共享库 (.so) 如何调用在其加载程序代码中实现的函数?

c - 无法将字符串写入 *char[]

c - close() 在 Linux 上调用 fsync() 吗?

linux - sed命令替换字符串

c - unsigned char 140, unicode 0x0152 = 338 的代码页或编码是什么?

angular - `node-pre-gyp install` Ubuntu 18.04相关错误

linux - Cygwin 告诉我文件不存在