【发布时间】:2013-09-04 02:58:58
【问题描述】:
这是(部分)我的服务器端代码
void timeout_handler(int value) {
printf("Handler\n");
return;
}
int main (int argc, char **argv) {
[...]
signal(SIGALRM, timeout_handler);
alarm(seconds);
int result = read(input_socket, buffer, sizeof(buffer));
if (result == -1 && errno == EINTR) {
printf("read() failed\n");
}
[...]
}
input_socket 是一个与客户端正确连接的 TCP 套接字(如果我从客户端发送数据,服务器会接收它们)。
作为警报信号的测试,我尝试只打开并连接套接字客户端而不发送任何数据。 我希望输出像
Handler
read() failed
但结果只是Handler消息,然后进程仍然处于活动状态。
为什么read() 不会因errno=EINTR 而失败?
【问题讨论】:
-
注意:您不应该在信号处理程序中调用 printf()(和朋友);它们不是异步安全的。
-
为什么
read()会失败?它正在等待某事出现。If a process attempts to read from an empty pipe, then read(2) will block until data is available. -
您在哪个操作系统上观察到这种行为? BSD?
-
printf的使用仅用于测试目的。而且我认为read()会失败,因为该进程接收到一个中断信号(alarm(seconds)),并且这些信号会中断慢速系统调用。我正在 OS X 上开发。
标签: c macos signals alarm system-calls