可以通过编程方式中断系统调用吗?

时间:2018-11-02 13:47:23

标签: c unit-testing zeromq system-calls interrupt

我正在尝试为我的ZeroMQ应用程序(通过cppzmq C ++层使用)编写单元测试。我的问题是,当我尝试关闭上下文时,有时(似乎是随机的)失败了。除了将错误代码设置为EINTR(这意味着系统调用中断)之外,我不知道为什么要这么做。

要为此行为编写一个(失败的)单元测试(然后可以尝试解决),我在想(see also this PR),如果我能以某种方式欺骗这些正在被中断的系统调用将非常有用。 。在这个欺骗性的系统调用中,我可以先调用常规的系统调用,然后在手动返回之前将错误代码设置为EINTR。例如,我想将recv替换为:

ssize_t recv(int sockfd, void *buf, size_t len, int flags) {
    ssize_t result = ::recv(sockfd, buf, len, flags);
    errno = EINTR;
    return result;
}

这可能吗?这是明智的做法吗(我能预见到问题吗?有没有其他方法可以解决我的单元测试问题?

1 个答案:

答案 0 :(得分:1)

在阻塞的系统调用期间,只要收到正确配置的中断,就会返回

EINTR

最容易发出的信号是SIGALRM,可以通过简单地调用以下命令进行调度:

alarm(1);
recv(...);

一秒钟之后,您会得到SIGALRM

如果您不想等待1秒钟,则可以使用setitimer()获得亚秒级的精度。