信号函数alarm、pause

三、alarm

1.介绍

alarm函数是在Unix和类Unix系统(例如Linux)中使用的一个函数,它可以用来设置一个定时器。当定时器到期时,系统将给调用alarm函数的进程发送一个SIGALRM信号。

#include <unistd.h>
unsigned int alarm(unsigned int seconds);

这里,seconds参数指定了定时器的延迟时间,单位是秒。当这段时间过去后,系统将向进程发送SIGALRM信号。

alarm函数的返回值是上一个定时器的剩余时间。如果没有设置上一个定时器,或者上一个定时器已经到期,alarm返回0。注意,如果你在定时器到期之前再次调用alarm函数,那么之前设置的定时器将被新的定时器替换。自然地如果调用alarm时传递0作为参数,那么将取消当前的定时器。

2.例子

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
​
void handle_sigalrm(int sig) {
    printf("Alarm!\n");
}
​
int main() {
    // Register signal handler for SIGALRM
    signal(SIGALRM, handle_sigalrm);
​
    printf("Setting alarm for 5 seconds...\n");
​
    // Set an alarm for 5 seconds from now
    alarm(5);
​
    sleep(10);
​
    printf("Exiting...\n");
    return 0;
}

四、pause

1.介绍

pause函数是Unix和类Unix操作系统(如Linux)中的一个函数,它使调用进程挂起(即暂停执行),直到接收到一个信号。

#include <unistd.h>
int pause(void);

pause函数没有参数。当一个信号到达并被处理后,pause函数返回,并返回-1。此外,它还将设置errnoEINTR,表示一个系统调用(在这种情况下是pause函数)被中断。

2.例子

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
​
void handle_sigint(int sig) {
    printf("Caught signal %d\n", sig);
}
​
int main() {
    // Register signal handler for SIGINT
    signal(SIGINT, handle_sigint);
​
    printf("Pausing. Press Ctrl+C to send a SIGINT signal\n");
​
    // Pause the program until a signal is received
    pause();
​
    printf("Exiting...\n");
    return 0;
}

在这个示例中,我们首先为SIGINT信号(通常由用户通过按下Ctrl+C生成)注册了一个处理函数。然后,我们调用pause函数挂起进程,直到接收到一个信号。当用户按下Ctrl+C时,SIGINT信号被生成,并调用我们的信号处理函数。然后,pause函数返回,程序继续执行并打印出"Exiting..."。

3.实现

在深入讨论实现之前,需要理解操作系统中的进程状态和上下文切换的概念。进程可以处于运行、就绪或睡眠(阻塞)状态之一。在进程被调度运行时,它的状态将从就绪状态变为运行状态;当进程因等待一个事件(例如信号)而无法继续运行时,它的状态将从运行状态变为阻塞状态。

pause函数实现了这种状态转换。当一个进程调用pause函数时,它将被设置为可中断的睡眠状态,然后操作系统将选择另一个进程来运行。这个过程称为上下文切换(context switch),涉及保存当前进程的状态(包括寄存器值、程序计数器等)和加载新进程的状态。

当信号到来时,操作系统将进程的状态从阻塞状态改变为就绪状态,然后在适当的时机调度这个进程运行。然后,进程将开始执行信号处理函数。在信号处理函数完成后,控制权将返回到pause函数,pause函数返回,并返回-1。

注意,这个过程中,pause函数并没有做很多工作。它只是告诉操作系统进程希望进入睡眠状态,并等待一个信号。所有的状态管理和上下文切换都由操作系统内核来处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值