我有一个在大量处理器上运行的应用程序。在处理器 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
如果可能的话,我想完全不改变这个库的配置。对任何可能的强大解决方法持开放态度。