日期:2014-05-16  浏览次数:20674 次

connect一定要检查EINTR吗?
我看到一段连接函数,是阻塞的connect但是还是放到一个select中去检查了,不解是因为EINTR中断信号的原因吗?
例如
rtv = connect(sockfd,(struct sockaddr *)&dest_addr, sizeof(struct sockaddr));
if(rtv == 0)
{
return sockfd;
}
if(errno != EINTR) //EINPROGRESS
{
close(sockfd);
return(-1);  
}
if(rtv < 0)
{

  struct timeval tv;
  tv.tv_sec = 10;
  tv.tv_usec = 0;
   
  FD_ZERO (&wfd);
  FD_ZERO(&rset);
  FD_SET(sockfd,&rset);
  FD_SET (sockfd, &wfd);
  if (select (sockfd + 1,&wfd, NULL, NULL, &tv) == 0)
  {
  close(sockfd);
  return -1;
  }

  int len = sizeof (error);
  if(getsockopt(sockfd,SOL_SOCKET,SO_ERROR,&error,&len) < 0)
  {
  close(sockfd);
  return(-1);
  }
return(sockfd); 
  }
部分代码,不明白 这里是阻塞的connect放到select中能检查??
EINTR错误会中断连接吗???????????

------解决方案--------------------
程序在执行的过程中会产生一些不预期的信号,比如硬件的错误导致的SIGBUS等,可能会打断connect的调用,而connect是不可重入的,所以检查一下还是有必要的