- 浏览: 142223 次
文章分类
最新评论
下面 3 个函数可以使进程休眠指定的时间(会有所延迟)。
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 并未显示地对这些交互进行定义)。
下面几个函数可用于查询信号编号和信号名之间的映射关系。
psignal 函数可移植地打印与信号编号对应的字符串。参数 msg(通常是程序名)输出到标准错误文件,后面跟着一个冒号和一个空格,再是该信号的说明,最后是一个换行符。如果 msg 是 NULL,则只有信号说明部分输出到标准错误文件,类似于 perror。
如果在 sigaction 信号处理程序中有 siginfo 结构,则可以使用 psiginfo 函数打印信号信息。它与 psignal 函数类似,不过可以访问除信号编号以外的更多信息,但不同的平台输出的这些额外信息可能有所不同。
如果只需要信号的字符描述部分,也不需要把它写到标准错误文件中(如可以写到日志文件中),就可以使用 strsignal 函数,它类似于 strerror。
sig2str 和 str2sig 函数是 Solaris 提供的。sig2str 将给定的信号编号翻译成字符串存放在 str 所指向的存储区,它会去掉信号名中的“SIG”前缀。str2sig 则将给出的信号名翻译成信号编号存放在 signop 指向的整型中,该名字要么是不带“SIG”前缀的信号名,要么是表示十进制信号编号的字符串(如“9”)。注意,这两个函数失败时都不会设置 errno。
#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。
发表评论
-
打开伪终端设备
2018-07-09 20:50 1250在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
伪终端概述
2018-06-02 11:05 1548伪终端就是指,一个应用程序看上去像一个终端,但事实上它 ... -
终端窗口大小和 termcap
2018-05-29 22:39 798多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 948终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 568尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 943虽然大多数终端设 ... -
终端属性和选项标志
2018-05-20 07:40 709tcgetattr 和 tcsetattr ... -
终端特殊输入字符
2018-05-17 06:33 814终端支持下表所示的特殊输入字符。 为了更改 ... -
终端 I/O 综述
2018-05-10 07:56 437终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 578在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 946在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 616在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 497消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 484有 3 种称作 XSI IPC ... -
IPC 通信之 FIFO
2018-02-06 22:55 419FIFO 也被称为命名管道,未命名的管道只能在两个相关 ... -
IPC 通信之管道
2018-01-30 22:22 389管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 887readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 454POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 614记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 438UNIX 系统中,守护进程遵循下列通用惯例。 ...
相关推荐
`ioremap`函数用于将设备的物理地址映射到虚拟地址空间。驱动程序通常需要直接访问硬件设备的物理地址,映射后的虚拟地址可以让驱动程序像访问普通内存一样访问硬件。其函数原型为`ioremap(offset, size)`,其中`...
接下来,我们需要定义一些DllImport特性标记的方法,这些方法会映射到Windows API的特定函数上。 1. **关机**: Windows API中用于关机的函数是`InitiateSystemShutdown`,它定义在`kernel32.dll`库中。在C#中,...
同时,为了持续监控并防止屏幕保护程序启动,我们需要重写消息映射函数`OnIdle`: ```cpp BOOL CpreventDlg::OnIdle(LONG lCount) { // 每次进入空闲状态时,重新检查并禁用屏幕保护 SystemParametersInfo(SPI_...
2. 库函数驱动:STM32标准库提供了更高级别的接口,如PWR_EnterSTOPMode()和PWR_EnterSTANDBYMode(),这些函数内部封装了寄存器操作,简化了代码,但仍然需要对STM32的内存映射有一定了解。 3. HAL库驱动:STM32的...
如果`CreateFileMapping`成功,进程A将得到一个内存映射文件句柄`lhShareMemory`,然后使用`MapViewOfFile`函数将这个内存映射到进程的地址空间。`MapViewOfFile`的作用是将文件映射对象的一部分映射到进程的虚拟...
- **EXTICR**(EXTI配置寄存器):设置外部中断线映射到相应的GPIO端口。 - **NVIC_ISERx**:中断向量集使能寄存器,启用唤醒中断。 - **EXTI_IMR** 和 **EXTI_EMR**:中断屏蔽和事件请求寄存器,控制中断源。 5...
* 共享内存通信:使用 CreateFileMapping 函数创建一个共享内存块,然后使用 MapViewOfFile 函数将内存块映射到进程的地址空间中。 * 消息通信:使用 SendMessage 函数将消息发送给另一个进程,然后使用 GetMessage ...
GPIO驱动在Linux内核中扮演着至关重要的角色,因为它使得操作系统能够与PNX4008芯片的GPIO接口进行通信,从而控制外部设备或者接收设备的信号。 在Linux系统中,GPIO驱动通常由以下部分组成: 1. **注册和初始化**...
进程的结构是通过 task_struct 结构体来描述的,该结构体包含了进程的所有信息,如进程的状态、进程的基本信息、进程标识符、内存相关信息、父进程相关信息、与进程相关的终端信息、当前工作目录、所接收的信号信息...
这部分涉及的是信号处理机制相关的函数,用于进程间的通信和异步事件处理。 - alarm():设置一个定时器,在定时器超时时,向调用进程发送SIGALRM信号。 - ferror():检测流上是否存在读/写错误。 - kill():向指定的...
`time`函数获取当前时间,`sleep`函数使进程休眠指定秒数,`clock_gettime`获取高精度时间。 总结来说,Linux C库函数提供了丰富的功能,涵盖从基本的数据类型操作到复杂的系统交互。掌握这些函数的使用,对于编写...
在`xxx_Init`函数中,使用`DrvLib_MapIoSpace`函数映射GPIO寄存器到用户空间,这样可以通过这个指针访问硬件寄存器。其他函数如`xxx_Deinit`、`xxx_Open`、`xxx_Close`、`xxx_Read`、`xxx_Write`则分别对应GPIO驱动...
3. **I/O操作**:通过端口或内存映射方式与硬件交互,读取键盘状态,写入配置命令。 4. **字符设备驱动**:LM8333驱动可能被实现为字符设备驱动,遵循内核的字符设备模型,包括open、close、read、write等方法。 5...
这个文件包含了与RA8806交互的所有函数和结构,如初始化函数、数据传输函数以及屏幕操作函数等。通过分析和理解这些函数,开发者可以了解如何在C8051平台上实现RA8806的完整驱动,从而实现高效、稳定的显示效果。 ...
Linux内核提供了`gpio_to_irq()`函数将GPIO映射为中断号,然后驱动可以注册中断处理函数,响应特定的引脚事件。 7. **电源管理**:在电源管理方面,GPIO驱动需要考虑如何在系统休眠或恢复时正确地保存和恢复GPIO...
#### 五、接口与信号 - **微控制器接口信号**:主要包括SPI时钟、数据输入输出、芯片选择等信号。 - **物理层信号**:涉及以太网的数据收发、碰撞检测、全双工/半双工模式切换等信号。 - **综合信号**:包括复位信号...
* sigaction(): 设置信号处理函数 * sigaddset(): 添加信号 * sigdelset(): 删除信号 * sigemptyset(): 清空信号集 * sigfillset(): 填充信号集 * sigismember(): 测试信号是否在信号集中 * signal(): 设置信号处理...
文档首先介绍了Hibernate的基本概念,包括其持久化机制,以及休眠团队和JBoss视觉设计团队的信息。然后,通过一系列教程帮助读者快速入门,如构建第一个Hibernate应用,涉及安装、类的创建、映射文件、配置、Maven...
ES8388是一款常用的音频编解码芯片,主要用于实现数字音频信号与模拟音频信号之间的转换,广泛应用于手机、蓝牙音箱、智能硬件等设备中。本文将深入探讨ES8388音频芯片及其驱动程序的相关知识。 首先,我们来看一下...