gpt4 book ai didi

c++ - 我可以写一个封闭的 socket 并强行纠正断管的错误吗?

转载 作者:行者123 更新时间:2023-12-02 10:07:02 25 4
gpt4 key购买 nike

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

如果可能的话,我想完全不修改该库的配置。公开所有可能的健壮解决方法。

最佳答案

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

禁用信号的一种方法是执行signal(SIGPIPE, SIG_IGN);

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

关于c++ - 我可以写一个封闭的 socket 并强行纠正断管的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59739413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com