免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3102 | 回复: 7
打印 上一主题 下一主题

为什么这样的语句没有执行sleep [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-11 11:53 |只看该作者 |倒序浏览
如下代码根本就没有睡眠,直接接着运行,不知为何,请各位看看。
main()
{
        char db_username[20];
        char db_passwd[20];
        memset(db_username,0,sizeof(db_username));
        memset(db_passwd,0,sizeof(db_passwd));
        strcpy(db_username,"admin" );
        strcpy(db_passwd,"yin369" );
       
        for( ; ; )
        {
       
                EXEC SQL CONNECT :db_username IDENTIFIED by :db_passwd;
                if ( sqlca.sqlcode != 0 )
                {
                        printf("connect error\n" );
                        return -1;
                }
               
                printf("TEST=====\n" );
                /*数据库执行语名*/
               
                EXEC SQL commit work release;
               
                sleep(10);
        }
        return 0;
}

上面的代码虽然执行到sleep处,但实际上没有睡眠10秒,
当把sleep位置换一个地方就可以,如下这样就可以,睡眠10秒,为什么?
main()
{
        char db_username[20];
        char db_passwd[20];
        memset(db_username,0,sizeof(db_username));
        memset(db_passwd,0,sizeof(db_passwd));
        strcpy(db_username,"admin" );
        strcpy(db_passwd,"yin369" );
       
        for( ; ; )
        {
       
                EXEC SQL CONNECT :db_username IDENTIFIED by :db_passwd;
                if ( sqlca.sqlcode != 0 )
                {
                        printf("connect error\n" );
                        return -1;
                }
               
                sleep(10);
                printf("TEST=====\n" );
                /*数据库执行语名*/
               
                EXEC SQL commit work release;
        }
       
        return 0;
}

[ 本帖最后由 zhilon 于 2006-10-11 11:56 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-10-11 14:13 |只看该作者
自己顶一下

论坛徽章:
0
3 [报告]
发表于 2006-10-11 15:44 |只看该作者
没道理,你怎么计算时间的,没到10秒?

论坛徽章:
0
4 [报告]
发表于 2006-10-11 16:29 |只看该作者
to:ddmmdd
界面直接不停的打印出:TEST=====
改成100秒也没有一点停顿.

论坛徽章:
0
5 [报告]
发表于 2006-10-11 16:40 |只看该作者
#include "bcIIComFunc.h"

EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE sqlda;
int main()
{
        char db_username[20];
        char db_passwd[20];
        char db_name[20];
        char sysdate[20];
        int  i;
        memset(db_username,0,sizeof(db_username));
        memset(db_passwd,0,sizeof(db_passwd));
        memset(db_name,0,sizeof(db_name));
        strcpy(db_username,"buss" );
        strcpy(db_passwd,"buss" );
        strcpy(db_name,"dctest3");
        
        for(i=0;i<10;i++ )
        {
        
                EXEC SQL CONNECT :db_username IDENTIFIED BY :db_passwd USING :db_name;  
                if ( sqlca.sqlcode != 0 )
                {
                        printf("connect error\n" );
                        return -1;
                }
                exec sql select to_char(sysdate,'yyyymmddhh24miss') into sysdate from dual;
                printf("TEST=====<%s>\n",sysdate);
                /*数据库执行语名*/
               
                EXEC SQL commit release;
               
                sleep(10);
        }
        return 0;
}
经过测试没有问题啊,OS:hp/unix,Ora9.2
$ ./test
TEST=====<20061011163203     >
TEST=====<20061011163214     >
TEST=====<20061011163224     >
TEST=====<20061011163235     >
TEST=====<20061011163245     >
TEST=====<20061011163256     >
TEST=====<20061011163306     >
TEST=====<20061011163317     >
TEST=====<20061011163327     >
TEST=====<20061011163338     >
$

[ 本帖最后由 ketos 于 2006-10-11 16:59 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-10-12 09:44 |只看该作者
增加下面语句,你在试试,应该是没有执行到sleep(10);
exec sql whenever  sqlerror continue;

for(;
{
}

论坛徽章:
0
7 [报告]
发表于 2006-10-24 09:51 |只看该作者
有两种情况会导致sleep函数返回:
1.经过sleep(seconds)里指定的seconds时间
2.进程捕捉到一个信号影响到sleep函数执行,导致sleep中断,提前返回

你的程序显然是遇到了第二种情况

经试验,
EXEC SQL COMMIT WORK RELEASE;
EXEC SQL ROLLBACK WORK RELEASE;
此类语句会产生SIGCHLD信号,是它导致sleep中断执行

你可以改为
EXEC SQL COMMIT WORK RELEASE;
  signal(SIGCHLD,SIG_IGN);
  sleep(30);

在sleep前加上"signal(SIGCHLD,SIG_IGN);"忽略SIGCHLD信号
记得还要加上signal.h头文件

论坛徽章:
0
8 [报告]
发表于 2006-10-25 16:07 |只看该作者
to:lahooo
完全如你所说,问题解决,谢谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP