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

linux多线程下可以直接使用errno吗?
int nrecved = recv(client_fd, recv_buf, SCDB_RECV_BUFFER, 0);
if (0 == nrecved)
{
}else if (nrecved < 0)
{
if (EINTR == errno)
{

}
}
多线程下,这样写有问题吗?

------解决方案--------------------
没问题,线程之间不影响,实际errno是一个函数
------解决方案--------------------
errno是线程安全的.
------解决方案--------------------
可以,但是得在函数调用后尽快把errno的值保存起来。因为很有可能被后面语句执行产生的新的errno给覆盖掉。
int nrecved = recv(client_fd, recv_buf, SCDB_RECV_BUFFER, 0); 
t_errno=errno
if (0 == nrecved) 

}else if (nrecved < 0) 

if (EINTR == t_errno) 



}
------解决方案--------------------
可以的。
extern int*__errno_location(void)
#define errno(*__errno_location())

保证自己维护一个。
------解决方案--------------------
呵呵,正好最近看了一下多线程
errno 是属于线程数据,LZ的写法没问题
参考网址:
http://www.qqread.com/linux/2007/06/y315928.html

------解决方案--------------------
函数返回后应立即保存errno,在根据该错误码获取错误描述时应该用线程安全的方法strerror_r