我可以写入一个关闭的套接字并强制纠正 broken pipe 错误吗?
Can I write to a closed socket and forcefully correct the broken pipe error?
我有一个在大量处理器上运行的应用程序。在处理器 0 上,我有一个函数,如果套接字打开则将数据写入套接字。此函数在处理器 0 上的单独线程中循环运行,即处理器 0 负责其自己的工作负载并有一个额外的线程 运行 套接字上的通信。
//This function runs on a loop, called every 1.5 seconds
void T_main_loop(const int& client_socket_id, bool* exit_flag)
{
//Check that socket still connected.
int error_code;
socklen_t error_code_size = sizeof(error_code);
getsockopt(client_socket_id, SOL_SOCKET, SO_ERROR, &error_code, &error_code_size);
if (error_code == 0)
{
//send some data
int valsend = send(client_socket_id , data , size_of_data , 0);
}
else
{
*(exit_flag) = false; //This is used for some external logic.
//Can I fix the broklen pipe here somehow?
}
}
当客户端套接字关闭时,程序应该忽略错误,据我所知这是标准行为。
但是,我正在使用外部库 (PETSc),它以某种方式检测到管道损坏错误并关闭整个并行 (MPI) 环境:
[0]PETSC ERROR: Caught signal number 13 Broken Pipe: Likely while reading or writing to a socket
如果可能的话,我想完全保持这个库的配置不变。对任何可能的稳健解决方法持开放态度。
默认情况下,如果 OS 试图写入(半)关闭的管道或套接字,它会发送线程 SIGPIPE
。
禁用信号的一个选项是signal(SIGPIPE, SIG_IGN);
。
另一种选择是对 send
使用 MSG_NOSIGNAL
标志,例如send(..., MSG_NOSIGNAL);
.
我有一个在大量处理器上运行的应用程序。在处理器 0 上,我有一个函数,如果套接字打开则将数据写入套接字。此函数在处理器 0 上的单独线程中循环运行,即处理器 0 负责其自己的工作负载并有一个额外的线程 运行 套接字上的通信。
//This function runs on a loop, called every 1.5 seconds
void T_main_loop(const int& client_socket_id, bool* exit_flag)
{
//Check that socket still connected.
int error_code;
socklen_t error_code_size = sizeof(error_code);
getsockopt(client_socket_id, SOL_SOCKET, SO_ERROR, &error_code, &error_code_size);
if (error_code == 0)
{
//send some data
int valsend = send(client_socket_id , data , size_of_data , 0);
}
else
{
*(exit_flag) = false; //This is used for some external logic.
//Can I fix the broklen pipe here somehow?
}
}
当客户端套接字关闭时,程序应该忽略错误,据我所知这是标准行为。
但是,我正在使用外部库 (PETSc),它以某种方式检测到管道损坏错误并关闭整个并行 (MPI) 环境:
[0]PETSC ERROR: Caught signal number 13 Broken Pipe: Likely while reading or writing to a socket
如果可能的话,我想完全保持这个库的配置不变。对任何可能的稳健解决方法持开放态度。
默认情况下,如果 OS 试图写入(半)关闭的管道或套接字,它会发送线程 SIGPIPE
。
禁用信号的一个选项是signal(SIGPIPE, SIG_IGN);
。
另一种选择是对 send
使用 MSG_NOSIGNAL
标志,例如send(..., MSG_NOSIGNAL);
.