首页
学习
活动
专区
圈层
工具
发布

Linux时序竞态问题(sleep函数的实现)

时序竞态是指同样的程序,多次调用运行的结果不同,这是由于争夺系统资源所造成的。...比如说我们要使用alarm和pause函数来实现一个sleep的功能,那么由于alarm函数的实现过程并不是一个原子操作,那么随时可能被中断。...此时往下继续调用pause函数的话,它会一直都收不到alarm发来的信号,所以导致进程的永久挂起。        为了解决这个问题,引用了sigsuspend函数。...进程在接收到UNBLOCK(mask之外)信号后,调用处理函数,然后还原信号集,sigsuspend返回,进程恢复执行。...下面通过使用alarm和sigsuspend函数来实现sleep函数,代码中有详细的注释来解释说明: #include #include #include <signal.h

3.6K30

Linux的头文件和CC++的头文件

一、linux常用头文件如下: ------------------------- POSIX标准定义的头文件 目录项 文件控制 的做法是把同一类函数或数据结构以及常数的声明放在一个头文件(header file)中。头文件中也可以包括任何相关的类型定义和宏(macros)。...在一般应用程序源代码中,头文件与开发环境中的库文件有着不可分割的紧密联系,库中的每个函数都需要在头文件中加以声明。...应用程序开发环境中的头文件(通常放置在系统/usr/include/目录中)可以看作是其所提供函数库(例如libc.a)中函数的一个组成部分,是库函数的使用说明或接口声明。...对于标准C函数库来讲,其最基本的头文件有15个。每个头文件都表示出一类特定函数的功能说明或结构定义,例如I/O操作函数、字符处理函数等。

10.5K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C语言之Sleep函数

    Sleep函数: 功 能: 执行挂起一段时间   用 法: unsigned sleep(unsigned seconds);   注意:   在VC中使用带上头文件#include ,在Linux下,gcc编译器中,使用的头文件因gcc版本的不同而不同#include   在VC中,Sleep中的第一个英文字符为大写的"S" ,在linux下不要大写,在标准C...中是sleep, 不要大写,简单的说VC用Sleep, 别的一律使用sleep 在VC中,Sleep()里面的单位,是以毫秒为单位,所以如果想让函数滞留1秒的话,应该是Sleep(1000); 在Linux...只是一般情况下,延迟时间数量级是秒的时候,尽可能使用sleep()函数。且此函数已被废除,可使用nanosleep。  如果延迟时间为几十毫秒,或者更小,尽可能使用usleep()函数。...sleep()不同,它会被挂起,把处理器让给其他的进程。

    8.6K80

    Linux进程的Uninterruptible sleep(D)状态

    Linux 进程有两种睡眠状态,一种interruptible sleep,处在这种睡眠状态的进程是可以通过给它发信号来唤醒的,比如发 HUP 信号给 nginx 的 master 进程可以让 nginx...Linux进程的睡眠状态有2种:     一种是可中断睡眠,其标志位是TASK_INTERRUPTIBLE ,可中断的睡眠状态的进程会睡眠直到某个条件变为真,比如说产生一个硬件中断、释放进程正在等待的系统资源或是传递一个信号都可以是唤醒进程的条件...比如你ctrl+c或者kill -9 ,能够立刻让进程响应这些信号(切换到TASK_RUNNING和再次进入就绪队列,执行注册的信号处理函数),不必要等待所需的资源满足后再响应这些信号。     ...正是因为得不到 IO 的相应,进程才进入了 uninterruptible sleep 状态,所以要想使进程从 uninterruptible sleep 状态恢复,就得使进程等待的 IO 恢复,比如如果是因为从远程挂载的...NFS 卷不可访问导致进程进入 D状态的,那么可以通过恢复该 NFS 卷的连接来使进程的 IO 请求得到满足,除此之外,要想干掉处在 D 状态进程就只能重启整个 Linux 系统了。

    12.2K10

    (十一)sleep(1)、sleep(0)和sleep(1000)的区别

    因此操作系统就会说:5号mm上来吃蛋糕……(5号mm心里郁闷,这不刚吃过嘛……人家要减肥……谁叫你长那么漂亮,获得了那么高的优先级)。 那么,Thread.Sleep 函数是干吗的呢?...这样,操作系统在随后的半个小时里面重新计算所有人总优先级的时候,就会忽略5号mm。Sleep函数就是干这事的,他告诉操作系统“在未来的多少毫秒内我不参与CPU竞争”。...与此相似的,Thread有个Resume函数,是用来唤醒挂起的线程。...好像上面所说的一样,这个函数只是“告诉操作系统我从现在起开始参与CPU竞争了”,这个函数的调用并不能马上使得这个线程获得CPU控制权。...由于粒度的原因,诸如sleep(1)之类的时间可能会长于1毫秒,所以sleep(1)会进入到睡眠然后进入等待状态;但sleep(0)不会,如果线程调度器的可运行队列中有大于或等于当前线程优先级的就绪线程存在

    8.9K42

    string头文件中常用函数

    1.1strlen求字符串长度 strlen是一个库函数所包含的头文件为#include,这里我们可以在C plusplus上找到strlen所包含的头文件以及strlen传入后函数所生成的一个参数...求出字符串的长度,首先我们肯定需要知道strlen这个函数所需要的函数参数以及返回类型 如图所示,strlen的返回类型为size_t,它的参数是const char* str 我们先写代码来理解他的含义...strcmp函数返回的是int类型,参数为两个,这里可以看到const这个函数开始 比较每个字符串的第一个字符。...源指针和目标指针所指向的对象的底层类型与此函数无关;结果是数据的二进制副本。 该函数不检查源中是否有任何终止null字符——它总是精确地复制num个字节。...strtok函数会改变被操作的字符串,所以在strtok函数切分字符串一般都是临时拷贝的内容可以修改。

    60010

    交叉编译的Linux的头文件路径

    我们交叉编译Linux的时候可能需要添加新的头文件,这个头文件放在哪里。编译应用程序和内核程序不太一样,分别说。...编译应用程序 编译器需要找到头文件有几种办法 编译时-I指定路径搜索 arm-linux-gnueabihf-gcc testtty1.c -o testtty1 -I/linux 上述例子中的头文件存于根目录下的.../arm-linux-gnueabihf/libc/usr/include 这是我的交叉编译链默认头文件位置,如果要使用自己的#include 文件,将头文件放入上述位置即可。...编译内核程序 内核编译是在需要内核的路径,所用使用上述默认路径。#include 使用的是内核默认路径。#include ""默认使用的是当前路径,当前目录下找不到会再去内核默认路径找的。...generated \ $(if $(KBUILD_SRC), -I$(srctree)/include) \ -I$(objtree)/include \ $(USERINCLUDE) 可以将头文件放入以上的路径

    13.1K50

    Linux中的sleep、usleep、nanosleep、poll和select

    在进行Linux C/C++编程时,可调用的sleep函数有好多个,那么究竟应当调用哪一个了?...下表列出了这几个函数间的异同点,可作为参考: 性质 精准度 线程安全 信号安全 sleep libc库函数 秒 是 不能和alarm同时使用 有些是基于alarm实现的,所以不能和alarm同时使用...usleep libc库函数 微秒 - - POSIX.1-2001已将usleep标注为废弃,POSIX.1-2008已删除usleep,应当使用nanosleep替代usleep nanosleep...(std::chrono::microseconds(1000)); #endif // __cplusplus >= 201103L 上述介绍的sleep函数均不方便控制它们提前结束,如果需要这种...sleep,可基于pthread_cond_timedwait实现,实现可参考CEvent源码: https://github.com/eyjian/libmooon/blob/master/src/

    6.2K40

    Linux驱动开发常用头文件

    :终端输入输出函数头文件,主要定义控制异步通信口的终端接口。 :时间类型头文件,主要定义了tm结构和一些有关时间的函数原形。...:I/O头文件,以宏的嵌入汇编程序形式定义对I/O端口操作的函数。 :内存拷贝头文件,含有memcpy()嵌入式汇编宏函数。...linux/kernel.h>:内核头文件,含有一些内核常用函数的原形定义。 linux/mm.h>:内存管理头文件,含有页面大小定义和一些页面释放函数原型。...linux/sched.h>: 调度程序头文件,定义了任务结构task_struct、初始任务0的数据,以及一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。...#include linux/cdev.h> //对字符设备结构cdev以及一系列的操作函数的定义。//包含了cdev 结构及相关函数的定义。

    2.2K10

    Linux系统之sleep命令的基本使用

    图片 一、sleep命令介绍 sleep命令是一个在Unix和类Unix操作系统中常见的命令。它允许用户可以在指定的时间内暂停当前的操作或者延迟执行下一条命令。...二、sleep的使用帮助 2.1 查看帮助信息 命令行的help帮助信息 [root@openEuler-test ~]# sleep --help Usage: sleep NUMBER[SUFFIX...可以通过在数字后面加上特定的字母来指定其他时间单位: s 表示秒(默认) m 表示分钟 h 表示小时 d 表示天 三、sleep命令的基本使用 3.1 指定暂停时间长度 暂停5秒钟: sleep...脚本中的位置:在脚本中使用sleep命令,要考虑其位置对整个脚本流程的影响,避免因不合理的暂停导致程序逻辑出现错误。...进程和资源占用:sleep命令在执行期间进程处于等待状态,但仍然会占用一定的系统资源,不过占用量通常较小,在资源紧张的环境下也需要留意。

    2K20

    STL中algorithm头文件下的常用函数

    使用algorithm需要在头文件下加using namespace std;才能使用 max()、min()和abs() max(x,y)与min(x,y):返回x和y的最大值和最小值(必须两个参数,...如果要返回三个数的最大值,则可以使用max(x,max(y,z))的写法 *abs(x)返回x的返回值 x必须是整数int。 浮点数请使用math头文件下的fabs。...如果是数组,则返回该位置的指针。 如果是容器,则返回返回该位置的迭代器。 upper_bound:用来寻找在数组或容器中[first,last)范围内的第一个值大于val的元素的位置。...显然,如果数组或容器没有需要寻找的元素,则lower_bound()和upper_bound()均返回该元素的位置的指针或迭代器(即假设存在该元素时,该元素应当在的位置)。...upper_bound(a, a + 10, 3) - a);// 输出 3 6 return 0; } 版权所有:可定博客 © WNAG.COM.CN 本文标题:《STL中algorithm头文件下的常用函数

    1.5K20

    Linux中Sleep和Wait命令的使用方式

    Sleep命令 sleep 命令会暂停指定的时间。它通常用于脚本中,但也适用于命令行。在下面的示例中, sleep 在两个 date 命令之间暂停30秒。...您可能会运行这样的命令: [root@localhost ~]# while true ; do who ; sleep 100 ; done 可以观察内存使用情况的变化。...将 sleep 命令替换为要等待的进程。此脚本还显示退出状态。 #!/bin/bash sleep 5 & process_id=$!...第一行在后台启动 sleep 命令。第二行获取最近执行的后台进程的进程 ID$!。然后脚本显示该信息,等待该进程完成并显示退出状态。...如果使用 wait -n(不需要额外的参数),wait 将等待任何后台任务完成。在下面的示例中, sleep 6 命令首先完成,脚本结束,但其他两个 sleep 进程将继续在后台运行几秒钟。 #!

    3.6K40

    Linux中Sleep和Wait命令的使用方式

    Sleep命令 sleep 命令会暂停指定的时间。它通常用于脚本中,但也适用于命令行。在下面的示例中, sleep 在两个 date 命令之间暂停30秒。...您可能会运行这样的命令: [root@localhost ~]# while true ; do who ; sleep 100 ; done 可以观察内存使用情况的变化。...将 sleep 命令替换为要等待的进程。此脚本还显示退出状态。 #!/bin/bash sleep 5 & process_id=$!...第一行在后台启动 sleep 命令。第二行获取最近执行的后台进程的进程 ID$!。然后脚本显示该信息,等待该进程完成并显示退出状态。...如果使用 wait -n(不需要额外的参数),wait 将等待任何后台任务完成。在下面的示例中, sleep 6 命令首先完成,脚本结束,但其他两个 sleep 进程将继续在后台运行几秒钟。 #!

    3.5K20

    Linux中的sleep、usleep、nanosleep、poll和select

    在进行Linux C/C++编程时,可调用的sleep函数有好多个,那么究竟应当调用哪一个了?...下表列出了这几个函数间的异同点,可作为参考: 性质 精准度 线程安全 信号安全 sleep libc库函数 秒 是 不能和alarm同时使用 有些是基于alarm实现的,所以不能和alarm同时使用...usleep libc库函数 微秒 - - POSIX.1-2001已将usleep标注为废弃,POSIX.1-2008已删除usleep,应当使用nanosleep替代usleep nanosleep...纳秒 是 是 如被信号中断,则实际睡眠时长会小于参数指定的时长 C/C++常用封装: 1) 基于nanosleep的毫秒级封装 #include void millisleep(...(std::chrono::microseconds(1000)); #endif // __cplusplus >= 201103L 上述介绍的sleep函数均不方便控制它们提前结束,如果需要这种sleep

    9.2K20
    领券