linux下的sleep函数原型为:
        unsigned int sleep(unsigned int seconds);
而MFC中的Sleep函数原型为:

        void Sleep(DWORD dwMilliseconds);

也就是说,Linux下(使用的gcc的库),sleep()函数是以秒为单位的,sleep(1);就是休眠1秒。而MFC下的sleep()函数是以微秒为单位的,sleep(1000);才是休眠1秒。原来如此啊。而如果在Linux下也用微妙为单位休眠,可以使用线程休眠函数:void usleep(unsigned long usec);当然,使用的时候别忘记#include <system.h>哦。
    另外值得一提的是,linux下还有个delay()函数,原型为extern void delay(unsigned int msec);它可以延时msec*4毫秒,也就是如果想延时一秒钟的话,可以这么用 delay(250);

自己也可以写一个sleep函数.

#include <time.h>

void sleep(int n)
{
    int st  = clock();
    while ((clock() - st) <= n)
    	;
}

在linux下的C语言编程中,sleep函数可以方便地使进程按休眠一定的秒数,到了点后再自动恢复运行。然而sleep函数也是有几个过程组合而成的,其中就包括了对于linux信号的应用。

我将全文分为4个部分:

工作原理
设定要睡的秒数、起床
睡觉的实现
示例程序及注释

工作原理
a) 设定要睡的秒数
b) 睡觉
c) 到点起床

设定要睡的秒数、起床
每个进程都有一个私有闹钟,可以通过 alarm(秒数) 函数设定闹钟,到点时,私有闹钟会发送信号SIGALRM给进程。如果没有绑定自定义处理函数的话,默认的操作是杀死进程。显然在sleep函数的实现中,安排了一个自定义函数,且这个函数没有内容,只是防止进程关闭而已。

睡觉的实现
pause()函数可以挂起进程。

示例程序及注释
在这个程序中,模仿了sleep函数的实现,并实现了定时4秒。程序效果如下:

#include<stdio.h>
#include<signal.h>
 
#define SHHHH
 
main()
{
    //声明信号处理函数
    void wakeup(int);
    //本程序设定睡眠时间4秒
    printf("about to sleep for 4 seconds\n");
    //将信号SIGALRM与处理函数wakeup绑定
    signal(SIGALRM,wakeup);
    //调用私有闹钟定时4秒
    alarm(4);
    //将进程挂起,坐等到点
    pause();
    //只有到了点,调用了wakeup(因为我们定义了SHHHH)
    //所以wakeup没有显示,但程序恢复运行
    //从pause()处往下运行
    printf("Morning so soon?\n");
}
 
void wakeup(int signum)
{
#ifndef SHHHH
    printf("Alarm received from kernel\n");
#endif
}



Logo

更多推荐