求助:信号 --13 进程中断
信号 --13 进程中断
~~~~~~~~~~~~~~~~~~~~~~~~~
两台AIX服务器在socket通讯过程中,发送端服务器报了上述错误。
求助各位这是一个什么现象,怎么造成的呢?
由于没有查到有关资料,故在次求助。
谢谢。
问题点数:20、回复次数:5Top
1 楼bankcoder(下半生我信佛)回复于 2005-09-22 11:08:47 得分 0
查到这样的内容:
SIGPIPE 13 A Broken pipe: write to pipe with no readers
Top
2 楼bankcoder(下半生我信佛)回复于 2005-09-22 11:10:10 得分 0
POSIX 定义的信号
===============================================================================
信号 值 动作 注释
-------------------------------------------------------------------------
SIGHUP 1 A Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 A Interrupt from keyboard
SIGQUIT 3 A Quit from keyboard
SIGILL 4 A Illegal Instruction
SIGABRT 6 C Abort signal from abort(3)
SIGFPE 8 C Floating point exception
SIGKILL 9 AEF Kill signal
SIGSEGV 11 C Invalid memory reference
SIGPIPE 13 A Broken pipe: write to pipe with no readers
SIGALRM 14 A Timer signal from alarm(2)
SIGTERM 15 A Termination signal
SIGUSR1 30,10,16 A User-defined signal 1
SIGUSR2 31,12,17 A User-defined signal 2
SIGCHLD 20,17,18 B Child stopped or terminated
SIGCONT 19,18,25 Continue if stopped
SIGSTOP 17,19,23 DEF Stop process
SIGTSTP 18,20,24 D Stop typed at tty
SIGTTIN 21,21,26 D tty input for background process
SIGTTOU 22,22,27 D tty output for background process
-------------------------------------------------------------------------------
* 信号值是 Linux 系统在不同平台上的取值, 第一个数对 Alpha 和 Sparc 有效, 中
间的数对 i386 和 PowerPC 有效, 最后一个数对 MIPS 有效. "-" 表现缺少该信号.
* A: 默认动作是终止进程
* B: 默认动作是忽略信号
* C: 默认动作是 core 转储
* D: 默认动作是停止进程
* E: 信号不能被捕获
* F: 信号不能被忽略
===============================================================================
上述这个动作A可以修改吗?Top
3 楼bankcoder(下半生我信佛)回复于 2005-09-22 11:20:21 得分 0
讨论关于利用select()检测对方Socket关闭的问题:
仍然是本地Socket有东东可读,因为对方Socket关闭时,会发一个关闭连接
通知报文,会马上被select()检测到的。关于TCP的连接(三次握手)和关
闭(二次握手)机制,敬请参考有关TCP/IP的书籍。
不知是什么原因,UNIX好象没有提供通知进程关于Socket或Pipe对方关闭的
信号,也可能是cpu所知有限。总之,当对方关闭,一执行recv()或read(),
马上回返回-1,此时全局变量errno的值是115,相应的sys_errlist[errno]
为"Connect refused"(请参考/usr/include/sys/errno.h)。所以,在上
篇的for(;;)...select()程序块中,当有东西可读时,一定要检查recv()或
read()的返回值,返回-1时要作出关断本地Socket的处理,否则select()会
一直认为有东西读,其结果曾几令cpu伤心欲断针脚。不信你可以试试:不检
查recv()返回结果,且将收到的东东(实际没收到)写至标准输出...
在有名管道的编程中也有类似问题出现。具体处理详见拙作:发布一个有用
的Socket客户方原码。
至于主动写Socket时对方突然关闭的处理则可以简单地捕捉信号SIGPIPE并作
出相应关断本地Socket等等的处理。SIGPIPE的解释是:写入无读者方的管道。
在此不作赘述,请详man signal。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
从上述内容看,应该是我的接收服务器关闭了管道。
继续努力:)Top
4 楼gaoxianfeng(高)回复于 2005-09-22 12:37:38 得分 10
学习Top
5 楼yyy790601(发呆的鱼)回复于 2005-09-22 15:35:56 得分 10
写入的socket关闭了。Top




