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是不可重入的,所以检查一下还是有必要的