说明:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
QQ 群 号:513683159 【相互学习】
内容来源:
《Unix环境高级编程》
示例一:
1️⃣说明:
20s后一次性输出20个5,后每1s输出5+(数字++)
①每个进程只有一个闹钟。
②若多个闹钟且每个闹钟之间未超时则会将最新闹钟的余留值作为本次alarm()
调用的返回值。
③若多个闹钟且每个闹钟之间已超时(在调用回调函数前已收到信号)则会输出:Alarm clock
2️⃣源文件:alarm.c
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int val = 0;
int timeVal = 0;
void alrm_func(int num)
{
alarm(1);
fprintf(stdout, "%d\n", val++);
}
int main(int argc, char *argv[])
{
alarm(1);
alarm(10);
// sleep(11); 则会输出:Alarm clock
alarm(5);
sleep(2);
timeVal = alarm(20);
signal(SIGALRM, alrm_func);
while (1) //死循环不退出进程
{
fprintf(stdout, "%d", timeVal);
sleep(1);
}
return 0;
}
3️⃣编译运行及结果
$gcc alarm.c -o alarm
$./alarm
333333333333333333330
31
32
33
34
35
示例二:
1️⃣说明:
情景一:若调用pause()
,则挂起进程,直到信号触发才会运行。
情景二:若调用sleep()
,则还会运行,不会马上输出,最后一起输出。
2️⃣源程序:pause.c
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int val = 0;
int timeVal = 0;
void alrm_func(int num)
{
alarm(1);
fprintf(stdout, "%d\n", val++);
}
int main(int argc, char *argv[])
{
timeVal = alarm(5);
signal(SIGALRM, alrm_func);
while (1) //死循环不退出进程
{
fprintf(stdout, "%d", timeVal);
pause();
//sleep(1);
}
return 0;
}
3️⃣编译运行及结果
情景一:(pause)
$gcc pause.c -o pause
$./pause
00
01
02
情景二:(sleep)
$gcc pause.c -o pause
$./pause
000000
01
02
示例三
1️⃣说明:
从标准输入读一行写到标准输出,并使用alarm()
进行超时设置。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <setjmp.h>
#define MAXLINE 1024
static jmp_buf env_alrm;
static void alrm_func(int num)
{
longjmp(env_alrm,1);
}
int main(int argc, char *argv[])
{
int n;
char line[MAXLINE];
if (signal(SIGALRM, alrm_func) == SIG_ERR)
fprintf(stderr, "signal(SIGALRM) error");
if(setjmp(env_alrm) != 0)
fprintf(stderr, "read timeout");
alarm(10);
if ((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
fprintf(stderr, "read error");
alarm(0);
write(STDOUT_FILENO, line, n);
return 0;
}