有一多线程程序:
线程一: 使用oci(oracle call interface)从oracle取一个sequence,取完之后关闭session,然后connect A server端,组成报文丢给A 的server端; ---成功,链接显示ESTABLISHED
线程二: 监听38889端口,等待A client端链接。A 的client链接之后,立马被断开(我的程序没有close(fd),而是accept之后直接recv(fd,..... MSG_WAITALL)),因为对方被断开,所以recv(fd为默认属性,没有被设置成非阻塞)立即返回0,errno:successed。同样,对方使用telnet链接我的38889端口,立即显示connect refused。
分别2次使用命令netstat -an |grep 38889显示:
proto Local Address Foreign Address State
tcp 127.0.0.1:38889 0.0.0.0:* LISTEN
tcp 127.0.0.1:38889 56.16.71.37:端口号 FIN_WAIT_1
------------中间应该有FIN_WAIT_2状态,来不及截取-------------
proto Local Address Foreign Address State
tcp 127.0.0.1:38889 0.0.0.0:* LISTEN
tcp 127.0.0.1:38889 56.16.71.37:端口号 TIME_WAIT
根据tcp状态转换图,得知线程二的链路肯定是被close()了。
-------------------------------------------------------------------------------------------------------------
上面问题无解,曾以为是A 端的程序问题,但由于是另外一个机构,不好确定。所以更改服务器的代码的线程二,为循环accept(原来只允许accept一次,不方便测试),然后 pthread_create()。通过本机使用telnet到服务器的线程二,立马出现下图:
ora-24550: signal received: [si_signo=11] ---segment fault!
可以肯定的是,我的程序不会出现segment fault情况。 之前在本机测试n遍,模拟的A 服务端程序连接我的线程二,一切正常。
经上网查询ora-24550的情况,没有满意的,但大概知道好像是oracle 的 bug?
为了验证,我程序的正确性,把调用oci的函数给去掉了,然后程序一切正常~~~~~~~~~~~~~~~~~(注意,原线程一使用完oci函数后立即关闭session,释放所有数据库相关资源,再也不会去和oracle打交道了。线程二根本就不会去碰oracle)。
此问题何解,大侠们帮帮忙啊?
附上,2篇老外的回答:
http://www.dba-oracle.com/t_ora_24550_unhandled_signal.htm
https://scn.sap.com/thread/2071168