gpt4 book ai didi

c++ - `signal` CentOS 上的函数 : unexpected behavior

转载 作者:行者123 更新时间:2023-11-30 04:02:13 25 4
gpt4 key购买 nike

我需要在 CentOS 应用程序上禁用 SIGPIPE,因为当它在不稳定的 Internet 连接下工作时,这个信号会使我的应用程序崩溃。我在 main 函数中使用以下代码:

signal(SIGPIPE, SIG_IGN);

但是,程序仍然因 SIGPIPE 而崩溃。是什么原因?我是要在每个线程上调用这个函数,还是在 main 函数中调用就足够了,程序将全局忽略 SIGPIPE?如果不需要在每个线程上都调用它,为什么 SIGPIPE 如果应该忽略信号,它仍然会使程序崩溃?

最佳答案

这是一个代码示例,可让您在 Linux 上设置自己的信号处理程序,捕获 SIGPIPE 并对其执行一些操作。

#include <signal.h>
#include <unistd.h>
#include <cerrno>
#include <system_error>
#include <iostream>

static sigset_t theMask;
static int count = 0;

static void
signalWrapper(
int theSignalNumber,
siginfo_t* theSignalDescription,
void* theUserContext)
{
// Do something here as reaction to you SIGPIPE
// This is better way to react on such things

std::cout << "Got signal " << theSignalNumber << std::endl;

// Reinstall handler
struct ::sigaction sa;
sa.sa_sigaction = &signalWrapper;
sa.sa_mask = theMask;
sa.sa_flags = SA_SIGINFO;

try
{
if (::sigaction(theSignalNumber, &sa, NULL) == -1)
throw std::error_code(errno, std::system_category());
}
catch (const std::error_code& ec)
{
std::cerr << ec << std::endl;
}

count++;
}

void
setupSignalHandlers()
{
struct ::sigaction sa;

// Prepare mask
sigemptyset(&theMask);
sigaddset(&theMask, SIGPIPE);
// Add some more if you need it to process

sa.sa_mask = theMask;
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = &signalWrapper;

// Perform setup
try
{
if (::sigaction(SIGPIPE, &sa, NULL) == -1)
throw std::error_code(errno, std::system_category());
}
catch (const std::error_code& ec)
{
std::cerr << ec << std::endl;
}
}

int
main()
{
std::cout << "Set handler!" << std::endl;
setupSignalHandlers();

std::cout << "Emit 5 SIGPIPE signals" << std::endl;
while (count < 5)
{
kill(getpid(), SIGPIPE);
usleep(100);
}

return 0;
}

和输出:

Set handler!
Emit 5 SIGPIPE signals
Got signal 13
Got signal 13
Got signal 13
Got signal 13
Got signal 13

我提供了信号处理程序,因为处理破坏应用程序的信号比忽略它更正确。也许您需要重新建立连接或做一些其他事情。

关于c++ - `signal` CentOS 上的函数 : unexpected behavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25280041/

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