`

休眠函数与信号映射函数

阅读更多
    下面 3 个函数可以使进程休眠指定的时间(会有所延迟)。
#include <unistd.h>
unsigned int sleep(unsigned int second);     /* 返回值:0 或未休眠完的秒数 */
#include <time.h>
int nanosleep(const struct timespec *reqtp, struct timespec *remtp);
                       /* 返回值:若休眠到要求的时间,返回 0;若出错,返回 -1 */
int clock_nanosleep(clockid_t clock_id,int flags,const struct timespec *reqtp,struct timespec *remtp);
                   /* 返回值:若休眠到要求的时间,返回 0;若出错,返回 错误码 */

    sleep 函数使进程挂起直到经过 seconds 秒或调用进程捕捉到一个信号并从信号处理程序返回。
    nanosleep 函数与 sleep 类似,但提供了纳秒级的精度。reqtp 参数用秒和纳秒指定了需要休眠的时间长度,remtp 参数则代表未休眠完的时间长度,如果不感兴趣可将其置为 NULL。nanosleep 函数并不涉及产生任何信号,所以不需要担心与其他函数的交互。
    clock_nanosleep 函数使用相对于特定时钟的延迟时间来挂起调用线程。clock_id 参数指定了计算延迟时间基于的时钟。flags 参数用于控制延迟是相对的(设置为 0 时)还是绝对的(设置为 TIMER_ABSTIME 时)。reqtp 和 remtp 同 nanosleep 函数。不过使用绝对时间时,remtp 参数未使用,因为没必要。在时钟到达指定的绝对时间值以前,可以为其他的 clock_nanosleep 调用复用 reqtp 参数相同的值。
    下面程序是 POSIX.1 sleep 函数的一种实现,它可靠地处理信号,避免了早期实现中的竞争条件,但是仍未处理与以前设置的闹钟的交互作用(POSIX.1 并未显示地对这些交互进行定义)。
#include <unistd.h>
#include <signal.h>

static void sig_alrm(int signo){
	;	// nothing to do, just returning wakes up sigsuspend().
}

unsigned int sleep(unsigned int seconds){
	unsigned int	unslept;
	struct sigaction	act, oldact;
	sigset_t	newmask, oldmask, susmask;

	/* set handler, save previous information */
	act.sa_handler = sig_alrm;
	sigemptyset(&act.sa_mask);
	act.sa_flags = 0;
	sigaction(SIGALRM, &act, &oldact);

	/* block SIGALRM and save current signal mask */
	sigemptyset(&newmask);
	sigaddset(&newmask, SIGALRM);
	sigprocmask(SIG_BLOCK, &newmask, &oldmask);
	
	alarm(seconds);
	susmask = oldmask;
	sigdelset(&susmask, SIGALRM);	// make sure SIGALRM isn't blocked 
	sigsuspend(susmask);	// wait for any signal to be caught

	/* some signal has been caught, SIGALRM is now blocked */
	unslept = alarm(0);
	/* reset previous action */
	sigaction(SIGALRM, &oldact, NULL);
	/* reset signal mask, which unblocks SIGALRM */
	sigprocmask(SIG_SETMASK, &oldmask, NULL);
	return unslept;
}


    下面几个函数可用于查询信号编号和信号名之间的映射关系。
#include <signal.h>
void psignal(int signo, const char *msg);
void psiginfo(const siginfo_t *info, const char *msg);
#include <string.h>
char *strsignal(int signo);    /* 返回值:指向描述该信号的字符串的指针 */

// Solaris 提供的
#include <signal.h>
int sig2str(int signo, char *str);
int str2sig(const char *str, int *signop);
                      /* 返回值:若成功,都返回 0;否则,都返回 -1 */

    psignal 函数可移植地打印与信号编号对应的字符串。参数 msg(通常是程序名)输出到标准错误文件,后面跟着一个冒号和一个空格,再是该信号的说明,最后是一个换行符。如果 msg 是 NULL,则只有信号说明部分输出到标准错误文件,类似于 perror。
    如果在 sigaction 信号处理程序中有 siginfo 结构,则可以使用 psiginfo 函数打印信号信息。它与 psignal 函数类似,不过可以访问除信号编号以外的更多信息,但不同的平台输出的这些额外信息可能有所不同。
    如果只需要信号的字符描述部分,也不需要把它写到标准错误文件中(如可以写到日志文件中),就可以使用 strsignal 函数,它类似于 strerror。
    sig2str 和 str2sig 函数是 Solaris 提供的。sig2str 将给定的信号编号翻译成字符串存放在 str 所指向的存储区,它会去掉信号名中的“SIG”前缀。str2sig 则将给出的信号名翻译成信号编号存放在 signop 指向的整型中,该名字要么是不带“SIG”前缀的信号名,要么是表示十进制信号编号的字符串(如“9”)。注意,这两个函数失败时都不会设置 errno。
分享到:
评论

相关推荐

    linux2.6.38内核驱动常用函数.pdf

    `ioremap`函数用于将设备的物理地址映射到虚拟地址空间。驱动程序通常需要直接访问硬件设备的物理地址,映射后的虚拟地址可以让驱动程序像访问普通内存一样访问硬件。其函数原型为`ioremap(offset, size)`,其中`...

    C# 系统开关机系列, 关机\重启\休眠

    接下来,我们需要定义一些DllImport特性标记的方法,这些方法会映射到Windows API的特定函数上。 1. **关机**: Windows API中用于关机的函数是`InitiateSystemShutdown`,它定义在`kernel32.dll`库中。在C#中,...

    vc win32 win api 防止 屏幕保护 防止显示器自动关闭

    同时,为了持续监控并防止屏幕保护程序启动,我们需要重写消息映射函数`OnIdle`: ```cpp BOOL CpreventDlg::OnIdle(LONG lCount) { // 每次进入空闲状态时,重新检查并禁用屏幕保护 SystemParametersInfo(SPI_...

    STM32F407实现待机、休眠和唤醒【支持STM32F40X系列单片机】

    2. 库函数驱动:STM32标准库提供了更高级别的接口,如PWR_EnterSTOPMode()和PWR_EnterSTANDBYMode(),这些函数内部封装了寄存器操作,简化了代码,但仍然需要对STM32的内存映射有一定了解。 3. HAL库驱动:STM32的...

    进程之间共享内存

    如果`CreateFileMapping`成功,进程A将得到一个内存映射文件句柄`lhShareMemory`,然后使用`MapViewOfFile`函数将这个内存映射到进程的地址空间。`MapViewOfFile`的作用是将文件映射对象的一部分映射到进程的虚拟...

    STM32F429实现休眠待机唤醒【STM32F42X系列单片机_寄存器驱动】.zip

    - **EXTICR**(EXTI配置寄存器):设置外部中断线映射到相应的GPIO端口。 - **NVIC_ISERx**:中断向量集使能寄存器,启用唤醒中断。 - **EXTI_IMR** 和 **EXTI_EMR**:中断屏蔽和事件请求寄存器,控制中断源。 5...

    Windows进程编程

    * 共享内存通信:使用 CreateFileMapping 函数创建一个共享内存块,然后使用 MapViewOfFile 函数将内存块映射到进程的地址空间中。 * 消息通信:使用 SendMessage 函数将消息发送给另一个进程,然后使用 GetMessage ...

    gpio.rar_linux gpio

    GPIO驱动在Linux内核中扮演着至关重要的角色,因为它使得操作系统能够与PNX4008芯片的GPIO接口进行通信,从而控制外部设备或者接收设备的信号。 在Linux系统中,GPIO驱动通常由以下部分组成: 1. **注册和初始化**...

    嵌入式软件开发技术:第3章 嵌入式Linux多任务编程.ppt

    进程的结构是通过 task_struct 结构体来描述的,该结构体包含了进程的所有信息,如进程的状态、进程的基本信息、进程标识符、内存相关信息、父进程相关信息、与进程相关的终端信息、当前工作目录、所接收的信号信息...

    Linux C 常用库函数手册

    这部分涉及的是信号处理机制相关的函数,用于进程间的通信和异步事件处理。 - alarm():设置一个定时器,在定时器超时时,向调用进程发送SIGALRM信号。 - ferror():检测流上是否存在读/写错误。 - kill():向指定的...

    linux C库函数

    `time`函数获取当前时间,`sleep`函数使进程休眠指定秒数,`clock_gettime`获取高精度时间。 总结来说,Linux C库函数提供了丰富的功能,涵盖从基本的数据类型操作到复杂的系统交互。掌握这些函数的使用,对于编写...

    wince6.0 下 新建和修改gpio驱动

    在`xxx_Init`函数中,使用`DrvLib_MapIoSpace`函数映射GPIO寄存器到用户空间,这样可以通过这个指针访问硬件寄存器。其他函数如`xxx_Deinit`、`xxx_Open`、`xxx_Close`、`xxx_Read`、`xxx_Write`则分别对应GPIO驱动...

    lm8333.rar_V2

    3. **I/O操作**:通过端口或内存映射方式与硬件交互,读取键盘状态,写入配置命令。 4. **字符设备驱动**:LM8333驱动可能被实现为字符设备驱动,遵循内核的字符设备模型,包括open、close、read、write等方法。 5...

    c8051驱动RA8806

    这个文件包含了与RA8806交互的所有函数和结构,如初始化函数、数据传输函数以及屏幕操作函数等。通过分析和理解这些函数,开发者可以了解如何在C8051平台上实现RA8806的完整驱动,从而实现高效、稳定的显示效果。 ...

    GPIO.rar_GPIO_GPIO 驱动

    Linux内核提供了`gpio_to_irq()`函数将GPIO映射为中断号,然后驱动可以注册中断处理函数,响应特定的引脚事件。 7. **电源管理**:在电源管理方面,GPIO驱动需要考虑如何在系统休眠或恢复时正确地保存和恢复GPIO...

    iEthernet_W5200_数据手册_v1.2.3_cn

    #### 五、接口与信号 - **微控制器接口信号**:主要包括SPI时钟、数据输入输出、芯片选择等信号。 - **物理层信号**:涉及以太网的数据收发、碰撞检测、全双工/半双工模式切换等信号。 - **综合信号**:包括复位信号...

    Linux C api参考手册

    * sigaction(): 设置信号处理函数 * sigaddset(): 添加信号 * sigdelset(): 删除信号 * sigemptyset(): 清空信号集 * sigfillset(): 填充信号集 * sigismember(): 测试信号是否在信号集中 * signal(): 设置信号处理...

    Hibernate4.3.4.Final-中文文档

    文档首先介绍了Hibernate的基本概念,包括其持久化机制,以及休眠团队和JBoss视觉设计团队的信息。然后,通过一系列教程帮助读者快速入门,如构建第一个Hibernate应用,涉及安装、类的创建、映射文件、配置、Maven...

    mmio_nvram.rar_memory

    标题"mmio_nvram.rar_memory"表明我们关注的是一个与内存映射非易失性RAM相关的源代码文件,即`mmio_nvram.c`。这个文件很可能是Linux内核驱动程序的一部分,用于处理通过内存映射接口访问的NVRAM。 内存映射...

Global site tag (gtag.js) - Google Analytics