- 论坛徽章:
- 0
|
问题描述:
AS400作为客户端,通过tcp通讯与一台Unix主机进行数据通讯,在通讯过程中,创建socket成功后,AS400端通过read去读取数据,若数据读取超时,则系统异常退出了,如何获取这种异常不让进程异常退出?
操作时,我使用的是call的方式,直接在命令行调用我的程序,如果read时超时,则系统就自动退出了log in状态,报错:
job end abnormally
disp the job log for information
然后就退出了登录状态
请教:
(1)在as400上,对于超时信号的处理方式错误导致此种情况出现
(2)信号异常的获取不对,导致无法正常获取到信息
(3)如何查看出错的“disp the job log for information”日志信息?
相关代码:
sock读取的底层代码:- int tipsReadn(int fd,char *ptr,int nbytes,int timeval)
- {
- int nleft, nread;
- void catchAlarm( );
- signal ( SIGALRM, catchAlarm );
- nleft = nbytes;
- while ( nleft > 0 ) {
- setAlarm ( timeval );
- nread = read ( fd, ptr, nleft );
- clearAlarm ( );
- if ( nread < 0 ) {
- if ( TIMEOUT )
- return FAILURE;
- else
- return ( nread );
- }
- else
- if ( nread == 0 )
- break;
- nleft -= nread;
- ptr += nread;
- }
- return nbytes - nleft ;
- }
- /**
- * 获取超时信号处理函数
- */
- void catchAlarm()
- {
- monitor_log(LOGERR, "timeout!!!" );
- TIMEOUT = 1;
- }
- /**
- * 清除超时信号
- */
- void clearAlarm()
- {
- alarm ( 0 );
- }
- /**
- * 设置超时信号
- */
- void setAlarm(int sec)
- {
- TIMEOUT = 0;
- alarm( sec );
- }
复制代码 我尝试在程序中修改,增加异常捕获:
/** 增加异常处理 */
volatile _INTRPT_Hndlr_Parms_T inf;
#pragma exception_handler(_end,inf,0,_C2_MH_ESCAPE,_CTLA_HANDLE_NO_MSG)
改后的代码如下:- int tipsReadn(int fd,char *ptr,int nbytes,int timeval)
- {
- int nleft, nread;
- void catchAlarm( );
- /** 增加异常处理 */
- [b]volatile _INTRPT_Hndlr_Parms_T inf;
- #pragma exception_handler(_end,inf,0,_C2_MH_ESCAPE,_CTLA_HANDLE_NO_MSG)[/b]
- signal ( SIGALRM, catchAlarm );
- nleft = nbytes;
- while ( nleft > 0 ) {
- setAlarm ( timeval );
- nread = read ( fd, ptr, nleft );
- clearAlarm ( );
- if ( nread < 0 ) {
- if ( TIMEOUT )
- return FAILURE;
- else
- return ( nread );
- }
- else
- if ( nread == 0 )
- break;
- nleft -= nread;
- ptr += nread;
- }
- _end:
- return nbytes - nleft ;
- }
复制代码 但是未起到任何作用,不知是否我这个#pragma的处理写的不对还是什么 |
|