1

我有一个在大量处理器上运行的应用程序。在处理器 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

如果可能的话,我想完全不改变这个库的配置。对任何可能的强大解决方法持开放态度。

4

1 回答 1

2

默认情况下,如果操作系统SIGPIPE尝试写入(半)封闭的管道或套接字,则会发送线程。

禁用信号的一种选择是执行signal(SIGPIPE, SIG_IGN);.

另一种选择是使用MSG_NOSIGNAL标志send,例如send(..., MSG_NOSIGNAL);

于 2020-01-14T18:07:21.537 回答