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

perror和strerror怎么获取的错误不一致.
例如代码如下:
if (connect(sock, (struct sockaddr *)s_addr, sizeof(struct sockaddr_in)) < 0)
{
  perror("connect failure");
  printf("connect failure: %s\n",strerror(errno));
  printf("Unable to connect to remote host (%s)\n",inet_ntoa(s_addr->sin_addr));
  return (-1);
}

然后我们可以看到错误信息是:
connect failure: Network is unreachable 1
connect failure: Illegal seek 2
Unable to connect to remote host (210.75.23.149)


红色的1,2都是获取错误信息为什么会出现,两个错误信息不一致呢.
纳闷了.....谁知道怎么回事吗????

------解决方案--------------------
Perror 最大的一个弊病是在调用后,很可能会把 errno 设置成 ESPIPE( 对应值为 29,错误描述为”Illegal seek”),影响后面 errno 的使用,这也是它线程不安全的原因之一,我们可以通过下面的实验得出此结论。

 说明:宏 PERROR_STRERROR 对应的代码块使用 perror 函数来捕获系统调用 fopen() 得到的错误,然后使用 strerror 函数来查看 perror 函数是否改变 errno 的值。如果两者输出结果不一致,则说明 errno 值被 perror 函数更改了。 
以上文字来自于http://tech.ddvip.com/2008-11/122654049391936_5.html