我可以写入一个关闭的套接字并强制纠正 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);.