我正在尝试为我的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;
}
这可能吗?这是明智的做法吗(我能预见到问题吗?有没有其他方法可以解决我的单元测试问题?
答案 0 :(得分:1)
EINTR
。
最容易发出的信号是SIGALRM
,可以通过简单地调用以下命令进行调度:
alarm(1);
recv(...);
一秒钟之后,您会得到SIGALRM
。
如果您不想等待1秒钟,则可以使用setitimer()
获得亚秒级的精度。