具有超时限制的read调用 (转)

通常的read函数并没有超时限制的功能。如果读取的设备是一个低速设备,可能需要等待一段时间才会读取成功。这里通过使用alarm定时函数来给 read 函数设置超时时限(10s)。若定时器到时,就会向进城发送SIGALRM信号,从而调用函数sig_alrm。其源代码如下所示:

 

#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include<unistd.h>
 
static void sig_alrm(int);
#define MAXLINE 4096
 
int main(void){
      int n;
      char line[MAXLINE];
 
      alarm(10);     //设定超时时限
 
      if(signal(SIGALRM,sig_alrm) == SIG_ERR){  //信号注册函数
             perror("signal");
             exit(-1);
      }
      if((n = read(STDIN_FILENO,line,MAXLINE)) < 0)
             perror("read");
      write(STDOUT_FILENO,line,n);
      exit(0);
}
 
static void sig_alrm(int signo){
      printf("in here alarm/n");
      exit(0);
}

 

在开发板上运行该程序,读者可以看到若在10s内输入,则程序正常返回,若没有输入,程序就进入sig_arm函数,如下所示:

#./alarm_read
#in here alarm


转载于:https://my.oschina.net/fengyeshangqing/blog/335934

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用Spring Cloud进行服务调用时,可能会遇到服务调用超时的情况。这种情况通常是由于网络延迟、服务负载过高或服务提供者响应时间过长等原因导致的。 要处理服务调用超时问题,可以通过以下几种方式来进行优化: 1. 调整超时时间:在使用Spring Cloud的Feign或RestTemplate进行服务调用时,可以通过设置超时时间来延长等待响应的时间。可以通过配置文件或代码来设置超时时间,例如: - 对于Feign客户端,可以在配置文件中设置`feign.client.config.<clientName>.connectTimeout`和`feign.client.config.<clientName>.readTimeout`来分别设置连接超时和读取超时时间。 - 对于RestTemplate,可以通过设置`RestTemplate`实例的`setConnectTimeout`和`setReadTimeout`方法来分别设置连接超时和读取超时时间。 需要根据具体情况来调整超时时间,确保足够长以处理预期的响应时间。 2. 使用断路器:Spring Cloud提供了断路器模式,例如Netflix Hystrix,用于处理服务调用的故障和超时。通过使用断路器,可以在服务调用失败或超时时提供备用响应,避免整个请求链路被阻塞。可以在Feign客户端或RestTemplate中使用断路器来处理服务调用超时。 3. 负载均衡策略:如果服务调用超时是由于服务负载过高导致的,可以考虑使用负载均衡策略来分散请求。Spring Cloud提供了多种负载均衡器,例如Ribbon,可以在服务调用时自动选择可用的服务实例。通过合理配置负载均衡策略,可以有效降低服务调用超时的概率。 4. 优化服务响应时间:如果服务提供者的响应时间过长,可以考虑对服务进行性能优化。例如,通过优化数据库查询、缓存数据、使用异步处理等方式来提高服务的响应速度。通过减少服务的响应时间,可以有效降低服务调用超时的概率。 综上所述,通过调整超时时间、使用断路器、优化负载均衡策略和优化服务响应时间等方法,可以有效处理Spring Cloud服务调用超时的问题。需要根据具体情况选择合适的优化方案,并进行适当的性能测试和监控来验证优化效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值