我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言的sleep、usleep、nanosleep等休眠函数如何使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言的sleep、usleep、nanosleep等休眠函数如何使用

这篇文章主要讲解了“C语言的sleep、usleep、nanosleep等休眠函数如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言的sleep、usleep、nanosleep等休眠函数如何使用”吧!

引子

一个无聊的死循环小代码:

#include <stdio.h>int main(int argc, char const *argv[]){    for (char c = 0; c < 128; c++) {                printf("cool\n");    }    return 0;}

以及 运行过程 展示版:

#include <stdio.h>#include <time.h>#include <stdlib.h>#include <unistd.h>int main(int argc, char const *argv[]){    struct timespec n_sleep;    n_sleep.tv_sec = 0; //secondes, integer part sleep duration    n_sleep.tv_nsec = 5e8L; //nanoseconds, decimal part sleep duration    char c;    for (c = 0; c < 128; c++) {        printf("char of c :%c\n", c);        printf("ASCII num of c :%d\n", c);        sleep(1); // 1 s        usleep(900000); // 0.9 s         nanosleep(&n_sleep, NULL); // 0 + 0.5 s    }    return 0;}

另外,推荐一下 clang 这款编译器,
它的(1)错误、(2)警告 提示非常直观、准确、体贴。
比如,上面的死循环代码,编译之后,它就贴心地显示了一个警告:

result of comparison of constant 128 with expression of type 'char' is always true      [-Wtautological-constant-out-of-range-compare]              for (c = 0; c < 128; c++) {                        ~ ^ ~~~

强烈推荐啊!!!
当然,如果还是喜欢或者必须使用 gcc 的话,建议可以将 clang 作为一个辅助选项。

(一) sleep 函数

头文件 unistd.h
头文件 unistd.h 中的原文如下:

extern unsigned int sleep (unsigned int __seconds);

通过debug的方式,进入 sleep 函数本体内部,可以反向查找到 sleep 函数所在的具体文件是 /glibc-2.23/sysdeps/posix/sleep.c 。

(根据gcc版本的不同,上面的库函数版本号 glibc-2.23 有所不同。)

源文件 sleep.c

sleep 函数的原型代码如下:

#include <time.h>#include <unistd.h>#include <errno.h>#include <sys/param.h>unsigned int __sleep(unsigned int seconds){    int save_errno = errno;    const unsigned int max =        (unsigned int)(((unsigned long int)(~((time_t)0))) >> 1);    struct timespec ts = { 0, 0 };    do {        if (sizeof(ts.tv_sec) <= sizeof(seconds)) {                        ts.tv_sec += MIN(seconds, max);            seconds -= (unsigned int)ts.tv_sec;        } else {            ts.tv_sec = (time_t)seconds;            seconds = 0;        }        if (__nanosleep(&ts, &ts) < 0)                        return seconds + ts.tv_sec;    } while (seconds > 0);    __set_errno(save_errno);    return 0;}weak_alias(__sleep, sleep)

sleep 函数的用法

简单地说, sleep 函数实现的功能是 让程序休眠若干秒钟,时间的最小刻度是「秒」。

extern unsigned int sleep (unsigned int __seconds);

sleep 函数的返回值

  • (1)如果 sleep 函数顺利执行了的话,返回值是实际休眠的时间数,

  • (2)如果实际休眠的时间和设定的休眠时间一致的话,返回值是0,

  • (3)不会返回表示 错误 信息的值,但是如果返回的值与设定的休眠时间的值一样的话,很可能 sleep 函数其实并没有执行,

  • (4)返回值类型是 unsigned int 型,也就是说,是一个 非负数 。

sleep 函数的参数

  • (1)参数的类型是 unsigned int 型,也就是说,是一个 非负数 ,

  • (2)参数的时间单位是 秒 。

所以, sleep 函数,使 进程/process 休眠的最短时间段,是一秒钟。

(二) usleep 函数

头文件 unistd.h
头文件 unistd.h 中的原文如下:

extern int usleep (__useconds_t __useconds);

查找上面的 sleep.c 文件的时候,在 find 命令的结果中看到了 usleep.c 文件和 sleep.c 文件位于同一个文件夹:
/glibc-2.23/sysdeps/posix/sleep.c 。

(根据gcc版本的不同,上面的库函数版本号 glibc-2.23 有所不同。)

源文件 usleep.c

usleep 函数的原型代码如下:

#include <time.h>#include <unistd.h>intusleep (useconds_t useconds){  struct timespec ts = { .tv_sec = (long int) (useconds / 1000000),             .tv_nsec = (long int) (useconds % 1000000) * 1000ul };    return __nanosleep (&ts, NULL);}

名称 usleep 的第一个字母 u 代表的是时间单位 微秒 的第一个字母。
虽然实际上是希腊字母的 &mu; ,但英语键盘里不方便敲出这个字母,所以就用了样子相似的英文字母 u 。
时间单位 微秒 的英文单词是 microsecond ,是由词根 micro 和 second 组合而成的单词。
微秒 是 10的负6次方 秒。

另外,还有一个以字母 m 开头的时间单位的英文单词 millisecond ,意思是 毫秒 ,也就是 千分之一秒。
注意,区分 micro 和 milli ,一个是 微 ,一个是 毫 。

usleep 函数的用法

简单地说, usleep 函数实现的功能是 让程序休眠若干「微秒」,时间的最小刻度是「微秒」,10的负6次方 秒。

extern int usleep (__useconds_t __useconds);

usleep 函数的返回值

网上查到的是:成功返回0,出错返回-1。

usleep 函数的参数

  • (1) 参数的类型是 __useconds_t ,这个类型的定义要查找好几个文件才找得到,

  • (2) 首先是找到了头文件 types.h ,具体路径是 /glibc/include/sys/types.h ,可惜这里面没有明确、具体的定义,

  • (3) 然后还得找到头文件 typesizes.h ,具体路径是 ==/glibc/sysdeps/mach/hurd/bits/typesizes.h ==,这里终于有了,

  • (4) 第一个宏, #define __USECONDS_T_TYPE __U32_TYPE ,在 typesizes.h 文件里,

  • (5) 第二个宏, #define __U32_TYPE unsigned int ,在 types.h 文件里,

  • (6) 真是折腾啊!这下总算知道 __useconds_t 就是 unsigned int 类型了,也就是 非负整数。

  • (7) 参数的时间单位是 微秒 。

所以, usleep 函数,使 进程/process 休眠的最短时间段,是一微秒。

(三) nanosleep 函数

头文件 time.h
这个 time.h 头文件的路径是 /glibc/time/time.h 。
在C语言自带的库目录里面,有好几个不同目录下的 time.h 文件,只有这个才是定义了 nanosleep 函数的。
也不知道,编译器在预处理阶段去获取的 time.h 到底是哪个? 或者说,全部都获取过来了?

头文件 time.h 中的原文如下:

extern int nanosleep (const struct timespec *__requested_time,              struct timespec *__remaining);

函数名称的 nano 是 纳米、纳秒 等计量单位的开头字母,一纳秒是10的负9次方 秒,是10的负6次方 毫秒,是10的负3次方 微秒。

源文件 nanosleep.c

下面是这个路径 /glibc/posix/nanosleep.c 的文件内容。

在C语言自带的函数库中搜索 nanosleep ,出来的结果同样有好几个,暂时分不清到底是哪个,先采用了这个。

nanosleep 函数的原型代码如下:

#include <errno.h>#include <time.h>int__nanosleep (const struct timespec *requested_time,         struct timespec *remaining){  __set_errno (ENOSYS);  return -1;}stub_warning (nanosleep)hidden_def (__nanosleep)weak_alias (__nanosleep, nanosleep)

nanosleep 函数的用法

简单地说, nanosleep 函数实现的功能是 让程序休眠若干「纳秒」,时间的最小刻度是「纳秒」,10的负9次方 秒。

extern int nanosleep (const struct timespec *__requested_time,              struct timespec *__remaining);

nanosleep 函数的返回值

网上查到的是:成功返回0,出错返回-1。

这个函数功能是暂停某个进程直到你规定的时间后恢复,参数 req 就是你要暂停的时间,其中 req->tv_sec 是以秒为单位,而 tv_nsec 以纳秒为单位(10的-9次方秒)。

由于调用 nanosleep 是进程进入 TASK_INTERRUPTIBLE ,这种状态是会相应信号而进入 TASK_RUNNING 状态的,这就意味着有可能会没有等到你规定的时间就因为其它信号而唤醒,此时函数返回 -1 ,切换剩余的时间会被记录在 rem 中。

return值: 若进程暂停到参数 *req 所指定的时间,成功则返回0;若有信号中断则返回-1,并且将剩余微秒数记录在 *rem 中。

nanosleep 函数的参数

第一个参数 *__requested_time 的数据类型是 struct timespec ,定义在 time.h 文件中,

具体是定义在 /glibc/time/bits/types/struct_timespec.h 文件中的。
文件内容如下:

#include <bits/types.h>struct timespec{  __time_t tv_sec;          __syscall_slong_t tv_nsec;    };

对于 struct timespec 数据类型的详细说明如下:
(昨天晚上上网查资料、自行测试的时候,自己写的英文笔记,请忽略语法疏漏~)

in header file of C lib, time.h, declaration as below:

struct timespec; (since C11)

struct timespec {    time_t tv_sec; // seconds    long tv_nsec; // nanoseconds};

Member objects / 结构体成员:

time_t tv_sec whole seconds (valid values are >= 0)
long tv_nsec nanoseconds (valid values are [0, 999999999])

time_t 类型是 long 型,成员 tv_sec 决定 休眠持续时间段的 整数部分:

member of 「tv_sec」 at the type of 「time_t」,
aka (also know as) 「long」 type,
determines the integer part of sleep duration;

time_t 类型是 long 型,成员 tv_nsec 决定 休眠持续时间段的 小数部分:

member of 「tv_nsec」 at the type of 「long」,
and in the range of [0, 999999999] or [0,1e9),
that means tv_nsec is forever less than 1 second,
determines the decimal part of sleep duration.

就算赋值给成员 tv_nsec 的数值直接计算下来超过了一秒,成员 tv_nsec 获得的实际的值也是被取余后的结果。

even if a value more than 999999999 ns given to tv_nsec,
actually what tv_nsec will get is a value cut down extra part,
eg. 1e9L or 100000000 will be cut the high bits and leave 0 to tv_nsec.

总而言之,整个的休眠时间段是 整数部分的 tv_sec 加上 小数部分的 tv_nsec 组成的。

so, the whole sleep duration is tv_sec + tv_nsec,
just as 「integer part + decimal part」 of the whole sleep duration.

所以, nanosleep 函数,使 进程/process 休眠的最短时间段,是一纳秒。

注意

  • unistd.h 是 unix 系统标准头文件,用于系统调用,相当于 win32 中的 windows.h , unistd.h 定义的函数只能用于 UNIX 环境中,而不能用于 windows 。

  • 所以 sleep 和 usleep 只能用于 Linux / Unix 下,而不能用于 windows 。

  • nalosleep 和 其它时间日期操作函数 一样,都是定义在 time.h 中的,所以都适用。

  • 使用 clang 编译c程序文件的时候,提示「警告」说, usleep 和 nanosleep 在 C99 中是非法的。不过因为实际采用的是 C11 标准,所以还是编译通过了,也能正常执行。这里只是 clang 的一个善意的提醒吧。

感谢各位的阅读,以上就是“C语言的sleep、usleep、nanosleep等休眠函数如何使用”的内容了,经过本文的学习后,相信大家对C语言的sleep、usleep、nanosleep等休眠函数如何使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言的sleep、usleep、nanosleep等休眠函数如何使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言的sleep、usleep、nanosleep等休眠函数如何使用

这篇文章主要讲解了“C语言的sleep、usleep、nanosleep等休眠函数如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言的sleep、usleep、nanosleep等
2023-07-05

C语言的sleep、usleep、nanosleep等休眠函数的使用

本文主要介绍了C语言的sleep、usleep、nanosleep等休眠函数的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-09

C语言函数如何使用

今天小编给大家分享一下C语言函数如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、函数的分类1.库函数库函数是C语言
2023-06-30

C语言的qsort()函数如何使用

本文小编为大家详细介绍“C语言的qsort()函数如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言的qsort()函数如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言 qsort()函数(
2023-06-30

c语言wait函数如何使用

在C语言中,wait函数用于等待子进程的结束。下面是wait函数的使用方法:1. 引入头文件:#include 和 #include 2. 创建子进程:使用fork函数创建子进程。3. 在父进程中调用wait函数:在父进程中调用wait函
2023-08-23

c语言abs函数如何使用

C语言中的abs函数是用来求一个整数的绝对值的函数。它的使用方式如下:1. 在程序中包含头文件 ``,该头文件中包含了abs函数的声明。2. 在代码中调用abs函数,并将要求绝对值的整数作为参数传递给它。3. abs函数会返回传入参数的绝对
2023-09-11

C语言函数strstr如何使用

函数strstr用于在一个字符串中搜索另一个字符串的出现位置。它的声明如下:```cchar *strstr(const char *haystack, const char *needle);```其中,haystack表示要搜索的字符串
2023-09-29

c语言reverse函数如何使用

在C语言中,可以通过以下步骤使用reverse函数来反转一个字符串:1. 引入字符串头文件:`#include `2. 声明字符串变量并初始化:`char str[] = "Hello World";`3. 调用reverse函数对字符串进
2023-09-15

c语言format函数如何使用

在C语言中,可以使用`printf`函数来格式化输出字符串。`printf`函数使用的格式化字符串可以包含占位符,用于指定输出的格式。格式化字符串中的占位符可以有以下几种:- `%d`:输出十进制整数- `%f`:输出浮点数- `%c`:输
2023-09-05

c语言lseek函数如何使用

在C语言中,lseek函数是用于设置文件指针位置的函数。其原型如下:```c#include off_t lseek(int fd, off_t offset, int whence);```参数说明:- fd:文件描述符,用于标识要操作的
2023-08-25

c语言time函数如何使用

time函数是C语言中的一个标准库函数,用于获取当前系统时间的秒数。使用time函数需要包含头文件。time函数的原型如下:```time_t time(time_t *seconds);```参数seconds是一个指向time_t类型的
2023-10-11

C++语言pow函数如何使用

这篇文章主要介绍“C++语言pow函数如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++语言pow函数如何使用”文章能帮助大家解决问题。pow的头文件是:#include p
2023-07-05

c语言strcmp函数如何使用

strcmp函数是C语言中用于比较两个字符串是否相等的函数,函数原型如下:int strcmp(const char* str1, const char* str2);参数str1和str2分别为要比较的两个字符串的地址,函数返回一个整数
c语言strcmp函数如何使用
2024-02-29

C语言的回调函数如何使用

这篇“C语言的回调函数如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言的回调函数如何使用”文章吧。1.程序架构一
2023-06-29

C语言的abs()函数和div()函数如何使用

这篇文章主要介绍“C语言的abs()函数和div()函数如何使用”,在日常操作中,相信很多人在C语言的abs()函数和div()函数如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言的abs()函数
2023-06-29

C语言库函数qsort如何使用

本篇内容介绍了“C语言库函数qsort如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、回调函数C语言库函数中的qsort的是一个回
2023-07-02

如何使用c语言中fread函数

这篇文章主要讲解了“如何使用c语言中fread函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用c语言中fread函数”吧!1、C语言fread函数用于将文件中的数据读取到指定的缓冲
2023-06-25

c语言中time函数如何使用

在C语言中,可以使用time函数获取当前时间的秒数。使用time函数需要包含头文件。time函数的原型如下:```ctime_t time(time_t *time);```time函数返回当前时间的秒数,即从1970年1月1日00:00:
2023-08-14

如何使用c语言中fclose函数

本篇内容主要讲解“如何使用c语言中fclose函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用c语言中fclose函数”吧!1、C语言fclose函数用于关闭使用fopen成功打开的文
2023-06-25

c语言排序函数如何使用

C语言中的排序函数有多种,最常见的是使用标准库函数`qsort()`进行排序。`qsort()`函数的原型为:```cvoid qsort(void *base, size_t nmemb, size_t size,int (*compar
2023-09-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录