nanosleep功能是UNIX系统的一种方法。nanosleep的目的是在一个确定的时间段内中止或暂停一个特定程序的执行。本文将帮助你理解并使你对 "如何利用nanosleep()函数 "有进一步的认识。还有一个函数是 "sleep",但我们将利用nanosleep(),因为我们可以提供纳秒级的暂停/睡眠时间。
语法

上图是nanosleep函数的语法,它被定义在<time.h>头文件中。
RQTP:RQTP 是一个指向timespec的指针,表示用户希望暂停或中止线程/程序的时间间隔。
RMTP:RMTP 是一个指向timespec的指针,表示该函数已经存储了该时间间隔的剩余时间。

结构timespec被用来识别纳秒级的时间间隔。
在C语言中使用nanosleep()的目的
Nanosleep是一个便携式操作系统接口。它是一个符合系统要求的调用,可以在特定的时间内暂停程序的某一线程的执行。类似的函数也可用于相同的目的。睡眠是其中一个需要几秒钟来暂停程序的过程,但据说它能提供低分辨率的暂停。因此,nanosleep函数准许用户以纳秒为单位提供睡眠时间,以获得更好的精度。
以前,nanosleep()方法被用来处理从计划线程中调用时高达2MS的暂停,但它需要更多的精度来处理时间关键的硬件或应用程序。
返回值
- 如果程序已经成功执行,将返回0。
- 如果程序执行不成功或失败并被中断,将返回-1。
错误
- EFAULT:EFAULT类型的错误发生在从用户空间拷贝信息的过程中出现任何问题。
- EINTR:EINTR类型的错误发生在被传递给线程的信号打断暂停的时候。
- EINVAL:如果结构timespec中的纳秒值不在0到99999999的范围内,或者有一个负值,就会产生这个错误。
如果在RQTP中确定的跨度不是颗粒度隐藏时钟的精确差异,它将被收集。此外,如果在CPU被允许再次执行调用字符串之前,其余的工作已经完成,以后可能会有推迟。
由于方法nanosleep的功能没有相对的时间跨度,如果在面临信号的阻碍或中断后反复调用该方法,往往会有风险,因为信号中断和重启调用之间的时间会导致睡眠完成后的轻微偏移。使用时钟的nanosleep(2),用一个直接的时间值来远离这个问题。
Nanosleep()应该按照POSIX.1的规定,用对手的REALTIME时钟来量化时间。Linux又一次利用CLOCK MONOTONIC时钟来监控时间。这大概是不重要的,因为POSIX.1的时钟settime(2)特别表达了CLOCK REALTIME的痉挛性变化不应该影响nanosleep()。
如果我们通过settime(2)设置REALTIME时钟的值。这不应该对那些被阻塞并在队列中等待基于此时钟的相对时间的程序产生任何影响。
C语言的例子

首先,我们必须初始化<time.h>库,它有一个timespec请求时间指针和一个timespec剩余时间指针的结构。有两个指针存储了用户想要暂停程序的时间,也存储了停止间隔时间所剩的时间。
之后,我们启动我们的主体,我们必须创建两个timespec对象,其中将包含我们的请求和剩余时间。我们可以给这两个对象分配任何数值,但在我们的案例中,我们选择了3秒和500纳秒。
现在,我们将把创建的对象的地址传递给nanosleep,你可以在第10行看到。我们还将通过观察方法nanosleep的返回值来检查程序是成功还是失败。
如果上述程序成功执行,将打印出以下输出。

如果我们把响应值改为1,程序执行将失败,并产生以下错误输出。

现在,如果我们想在我们的GCC终端上运行下面的代码。我们首先将我们的文件保存为main.c,然后在终端上使用以下命令来运行程序:"gcc-Wall main.c-o"。墙意味着在执行我们的程序时启用所有的警告信息。
BUG
nanosleep()的当前执行取决于典型的比特时钟组件,它的目标是1/HZ s。沿着这些思路,nanosleep()在预定的时间内持续停止,但它可能比指示的时间长10毫秒,直到互动再次变得可运行。对于类似的解释,在*rmtp中传达信号的情况下返回的值,通常调整为以下较大的差异1/HZ s。
理由
暂停一个字符串的执行一段时间,以调查情况,着眼于非侵入性的工作,这是正常的。通过对sleep()的直接扩展,可以满足无数的实际需要,从而获得更好的目标。
在POSIX.1-1990规范和SVR4中,执行这样的日常做法是可行的,只是唤醒的复现受到alarm()和sleep()函数目标的限制。在4.3 BSD中编写这样一个标准是很有可能的,同时不利用静态堆积,也不节省框架办公室。尽管利用其余的定时器_*()能力编写一个与sleep()相当的函数是可行的,但这种能力需要利用标志和预订一些重要的数字。IEEE标准1003.1-2001的这一卷要求nanosleep()在标志起作用的情况下是无害的。
nanosleep()的工作将在进展时返回0,在失败时返回-1,或者在受到干扰时再次返回。这最后一个选项情况与sleep()不完全相同。这样做是考虑到剩余的时间是利用争夺结构指针RMTP来返回的,而不是作为一种方式来带回批准。
结论
这项研究的重点是帮助你更好地掌握nanosleep()这个方法。为了很好地掌握像nanosleep这样的方法,有必要用最简单的例子来说明它们。我们已经尽力提供最好的信息,如bug、原理、例子、错误和概要。这样你就可以继续提高你的代码的可解释性和可重复使用性。我们已经进行了简单的语法解释。这篇文章将帮助你迅速获得对如何使用nanosleep()这个方法的全面解释。为了更好地使用该方法,作为变量的考虑因素已经被解决,并为用户做了很好的解释。