今天在suse下写了个多线程的socket程序,其中用到了select来控制connect超时。具体方法如下:
1 .建立 socket
2 .将该 socket 设置为非阻塞模式
3 .调用 connect()
4 .判断errno是否为EINPROGRESS,是:继续下一步,否:出错返回
5 .使用 select() 检查该 socket 描述符是否可写(注意,是可写)
6 .根据 select() 返回的结果判断 connect() 结果
7 .将 socket 设置为阻塞模式(如果你的程序不需要用阻塞模式的,这步就省了,不过一般情况下都是用阻塞模式的,这样也容易管理)
在suse下测试一切正常。可是移到AIX下就出问题了,在第4步判断errno时,发现errno总是0,因此立刻出错返回。
在网上搜索了一番,发现问题所在。原来linux系统的errno是线程安全的,但AIX的errno不是。要让AIX的errno线程安全,需要在编译时加上宏定义:-D_THREAD_SAFE.
总结:unix及类unix系统不是不好,但在实现上总有那么一点点的差别,对软件开发人员来说绝对是一种折磨。