Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 关闭telnet会话将把stdout重定向到http套接字_C_Sockets_Stdout_Netlink - Fatal编程技术网

C 关闭telnet会话将把stdout重定向到http套接字

C 关闭telnet会话将把stdout重定向到http套接字,c,sockets,stdout,netlink,C,Sockets,Stdout,Netlink,我有一个程序,显示输出到标准输出的日志 因此,如果我打开一个到目标linux的telnet会话,然后在此telnet会话上启动我的程序,那么我将获得telnet会话上显示的日志消息 在我的程序中,有一个小小的http服务器正在运行。现在,如果我更改目标linux的IP地址,然后重新启动接口(http服务器将自动重新启动,因为我使用netlink检测到IP地址的更改)然后我将关闭telnet会话,并将stdout消息重定向到http服务器打开的套接字,然后我将锁定日志消息的printf 我尝试使用

我有一个程序,显示输出到标准输出的日志

因此,如果我打开一个到目标linux的telnet会话,然后在此telnet会话上启动我的程序,那么我将获得telnet会话上显示的日志消息

在我的程序中,有一个小小的http服务器正在运行。现在,如果我更改目标linux的IP地址,然后重新启动接口(http服务器将自动重新启动,因为我使用netlink检测到IP地址的更改)然后我将关闭telnet会话,并将stdout消息重定向到http服务器打开的套接字,然后我将锁定日志消息的printf

我尝试使用select检测此锁,但未成功:

在转到prinf(锁定)之前选择返回成功


有什么建议可以避免这个问题吗?

如果我理解正确,运行HTTP服务器的telnet会话(为什么不使用SSH??)会因为IP地址的更改而中断

如果程序继续将数据写入该会话(这是它的stdout),那么之后会发生的情况是,当系统缓冲数据时,首先写入将成功,然后写入将被阻塞(而不是“锁定”)。最后,TCP连接将超时,写入操作将返回错误。TCP会话超时可能需要很长时间,也可能不需要很长时间,但最终会超时

如果您希望避免阻塞(例如,如果您的应用程序是事件驱动的且不能阻塞),则可以使日志输出代码使用对stdout的非阻塞写入。您需要使用
fcntl
将stdout更改为非阻塞,并且您可能需要完全避免stdio,因为stdio不是设计用于非阻塞输出的。您必须实现自己的缓冲并直接写入文件描述符1

您还提到,您希望在标准输出日志断开后登录到HTTP连接。您也可以这样做(在写入stdout时出错时触发),但这将需要更多的工作。您必须在应用程序内部管理日志缓冲区,直到HTTP客户端连接并请求它。您还需要添加一个设置,以便在没有HTTP客户端连接的情况下,如果日志太大,可以丢弃日志。所有这些都在一个问题的范围之内