免费注册 查看新帖 |

Chinaunix

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

[SCO UNIX] sleep函数使用失效,请教各位大师原因在哪里? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-29 11:18 |只看该作者 |正序浏览
本人使用的是asus ap2400服务器,安装sco506
奇怪的是,我设置的任务如:
50 22 * * *  "$HOME/bin/settle.sh" 总是失效,而同样的任务在HP的服务器却执行很好?....
于是本人用sleep函数实现,如下代码:
  #include <stdio.h>
  #include <time.h>

  struct tm * newtime;
  time_t long_time;
  char setthour[16];

main()
{
     while(1)
     {
         time(&long_time);
         newtime=localtime(&long_time);
         memset(setthour, 0x0, sizeof(setthour));
         sprintf(setthour, "%02d%02d", newtime->tm_hour,newtime->tm_min );
      printf("now, setthour is %s\n",setthour);

         if(memcmp(setthour, "2245", 4)>0 )
                system("$HOME/bin/settle.sh 2>/dev/null");
             sleep(10);
      }
}

但是sleep(10)也是常常会sleep到10分钟或随机的一段时间才打印调试信息,所以我设置的任务settle.sh要到晚上22:45分执行的, 一直执行的不好.....
但是cmos时钟却是正常的,本人很迷惑,不知道系统出现了什么问题,导致我使用的sleep或crontab任务都不能用好,拜托大师帮助找找原因,谢了!!!

论坛徽章:
0
10 [报告]
发表于 2005-11-29 12:41 |只看该作者
谢谢精灵使 CNL !!!
俺去try try 再向您汇报!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2005-11-29 12:33 |只看该作者
long_time=time(NULL);
newtime=localtime(&long_time);

论坛徽章:
0
8 [报告]
发表于 2005-11-29 12:26 |只看该作者
谢了 CNL 斑竹, 我的代码确实没有消耗时间的地方,其实就是您的代码:

while(1)
     {
         time(&long_time);
         newtime=localtime(&long_time);
         memset(setthour, 0x0, sizeof(setthour));
         sprintf(setthour, "%02d%02d", newtime->tm_hour,newtime->tm_min );
      printf("now, setthour is %s\n",setthour);

       if(memcmp(setthour, "2245", 4)>0 )
        {
             system("$HOME/bin/settle.sh 2>/dev/null");
             sleep(7200);
        }

          sleep(10);
     }

本人一直怀疑是硬件与sco506有什么不兼容的地方导致,但是交易进程却都是运转正常的啊?!
就是crontab 和 sleep运行异常的....

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2005-11-29 12:07 |只看该作者
原帖由 qiuzj 于 2005-11-29 12:00 发表
谢谢斑竹 CNL了,您的敏锐本人佩服!!

其实我简化了程序,应该为:
if(memcmp(setthour, "2245", 4)>0 )
{
       system("$HOME/bin/settle.sh 2>/dev/null");
       sleep(7200) ...

依你贴出的代码看除非你while循环里面还有别的耗费时间的代码
否则sleep(10)不可能出现你所说的这种情况,你可以自己做个测试

  1. while(1)
  2.      {
  3.          time(&long_time);
  4.          newtime=localtime(&long_time);
  5.          memset(setthour, 0x0, sizeof(setthour));
  6.          sprintf(setthour, "%02d%02d", newtime->tm_hour,newtime->tm_min );
  7.       printf("now, setthour is %s\n",setthour);

  8.           sleep(10);
  9.      }
复制代码

论坛徽章:
0
6 [报告]
发表于 2005-11-29 12:00 |只看该作者
谢谢斑竹 CNL了,您的敏锐本人佩服!!

其实我简化了程序,应该为:
if(memcmp(setthour, "2245", 4)>0 )
{
       system("$HOME/bin/settle.sh 2>/dev/null");
       sleep(7200);
}

sleep(10);

这里主要请教斑竹的是,可能什么原因导致了sleep(10)不是实际的sleep 10秒,
而是20秒或10分钟呢???
再次感谢!!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2005-11-29 11:54 |只看该作者
1 if(memcmp(setthour, "2245", 4)>0 )
如果settle.sh每日只能执行一次,那么你的这条语句逻辑上就是错误的
2 sco的crontab不读取任何环境变量,
如果你的settle.sh里面有$HOME等环境变量,必须替换为实际的值,
3 sco的crontab默认的路径PATH是/etc:/bin,
如果你的settle.sh里面使用了其他路径下命令或程序,必须手工设置正确的$PATH

论坛徽章:
0
4 [报告]
发表于 2005-11-29 11:43 |只看该作者
不好意思:
程序中少{}....

if(memcmp(setthour, "2245", 4)>0 )
{
       system("$HOME/bin/settle.sh 2>/dev/null");
}

sleep(10);

另外,我将$HOME修改为绝对路径也不行呀? 如下:
50 22 * * * "/usr/bank/bin/settle.sh"

是否sco506系统与硬件有什么问题 ? 因为连续取时钟时间总是有问题(sleep的时间都是很长的,象是未睡醒一样的),偶而取一次却很准确的,为什么呢?请大师指点了!!

论坛徽章:
0
3 [报告]
发表于 2005-11-29 11:36 |只看该作者
要想在C语言时获得$HOME的值,必须用取环境变量函数

论坛徽章:
0
2 [报告]
发表于 2005-11-29 11:30 |只看该作者
照你写的程序看,
22:45:10秒/ 22:45:20秒/22:45:30秒/ 22:45:40秒/ 22:45:50秒
一直到23:59分50秒每隔10秒都会运行一次settle.sh
这样的做法正常么?

crontab里面你还用$HOME,不知道crontab能够从哪里获得$HOME的值
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP