Linux中的Interrupted system call错误

最近公司的一个项目,上线时候遇到了一些问题,服务跑一段时间后连接不上。
发现报了Interrupted system call这个错误引起的。

查了下资料,大致原因是系统繁忙处理不过来导致的。
根据网上搜索到的资料
https://github.com/JustinTulloss/zeromq.node/issues/171
http://comments.gmane.org/gmane.network.zeromq.devel/15253
做了点修改


do {
rc = zmq_send(s, &msg, flags);
} while ((rc == -1) && (zmq_errno() == EINTR));





后面测试时候,算是没发生上面的错误了,希望再次上线后不要再出现这个错误。

转载于:https://my.oschina.net/yeezia/blog/313348

"Interrupted error: system call" 是一个常见的错误信息,通常出现在进行网络编程时,特别是在使用套接字(socket)进行通信时。这个错误表示一个系统调用被中断了。以下是一些可能的原因和解决方法: ### 可能的原因 1. **信号中断**:在系统调用过程中,程序接收到一个信号(如SIGINT、SIGTERM等),导致系统调用被中断。 2. **非阻塞I/O**:如果套接字被设置为非阻塞模式,某些操作可能会返回EINTR错误。 3. **超时**:某些系统调用(如`select`、`poll`等)在超时情况下也会返回EINTR错误。 ### 解决方法 1. **重试系统调用**:在捕获到EINTR错误后,可以重新尝试调用被中断的系统调用。 2. **信号处理**:确保在程序中正确处理信号,避免在系统调用过程中被中断。 3. **设置套接字为阻塞模式**:如果使用非阻塞I/O,可以考虑将套接字设置为阻塞模式。 ### 示例代码 以下是一个简单的示例,展示了如何在捕获到EINTR错误后重试系统调用: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> ssize_t safe_read(int fd, void *buf, size_t count) { ssize_t bytesRead; while ((bytesRead = read(fd, buf, count)) == -1 && errno == EINTR); return bytesRead; } int main() { int fd = 0; // 标准输入 char buffer[1024]; ssize_t bytesRead = safe_read(fd, buffer, sizeof(buffer)); if (bytesRead == -1) { perror("read"); return EXIT_FAILURE; } printf("Read %zd bytes: %.*s\n", bytesRead, (int)bytesRead, buffer); return EXIT_SUCCESS; } ``` ### 解释 1. **safe_read函数**:这个函数尝试读取数据,并在遇到EINTR错误时重新尝试读取。 2. **main函数**:主函数中调用safe_read函数读取标准输入,并处理可能的错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值