Chinaunix首页 | 论坛 | 博客
  • 博客访问: 247601
  • 博文数量: 53
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-01 10:17
文章分类

全部博文(53)

文章存档

2013年(53)

分类: C/C++

2013-09-13 23:57:47

1. alarm函数:

alarm函数是设置一个计时器, 在计时器超时的时候, 产生SIGALRM信号. 如果不忽略或捕捉此信号, 它的默认操作是终止调用该alarm函数的进程.

原型如下:

#include <unistd.h>

unsigned 
int alarm(unsigned int seconds);

返回0或余留秒数

说一下alarm的返回值问题, 每个进程只能有一个alarm维护的"闹钟".

如果该"闹钟"顺利超时, 则返回0;

如果该"闹钟"在计时过程中, 调用了另一个alarm函数, 则该"闹钟"的余留秒数作为该次alarm的返回值, 并且新的"闹钟"开始计时.(实际上是新的闹钟替代了以前的闹钟)

代码举例:

#include <unistd.h>
#include 
<signal.h>
#include 
<stdio.h>


/* My alarm func for print */
static unsigned int my_alarm(unsigned int nsec)
{
    printf(
"Wait for %u secs to alarm ", nsec);
    
return alarm(nsec);
}

/* My sleep func for print */
static unsigned int my_sleep(unsigned int nsec)
{
    printf(
"Sleep for %u secs ", nsec);
    
return sleep(nsec);
}

/* SIGALRM handler */
static void sig_alarm(int signo)
{
    printf(
"SIGALRM ");
}

int main()
{
    
/* Check alarm return value */
    unsigned 
int ret1, ret2;

    
/* Signal handle */
    
if (signal(SIGALRM, sig_alarm) < 0)
        perror(
"signal");

    printf(
"Alarm start: ");

    
/* First alarm */
    ret1 
= my_alarm(5);
    my_sleep(
3);
    
    printf(
"New alarm: ");
    
    
/* Second alarm */
    ret2 
= my_alarm(2);
    my_sleep(
4);

    printf(
"Alarm end ");

    
/* Show the two return values */
    printf(
"First  return: %u ", ret1);
    printf(
"Second return: %u ", ret2);

    
return 0;
}
这段代码中我自己封装了my_alarm和my_sleep, 在其中添加了printf的代码用于跟踪.

程序的运行结果如下:

Alarm start:
Wait for 
5 secs to alarm
Sleep for 
3 secs
New alarm:
Wait for 
2 secs to alarm
Sleep for 
4 secs
SIGALRM
Alarm end
First  return: 
0
Second return: 
2
由上面这个结果, 我想我对这个程序就不用多解释了.

由此可见alarm的返回值问题, 一目了然.


2. pause函数:

pause函数使调用进程挂起, 直到捕捉到一个信号. 它的原型如下:

#include <unistd.h>

int pause();

返回
-1, 并将errno设置为EINTR.
这个函数很简单, 由字面意思就可以理解出来"暂停". pause只有在执行了一个信号处理程序并从其返回时, pause才返回.

pause函数

#include
#include
#include

void sigroutine(int unused)
{
    printf("Catch a signal SIGINT \n");
}

int main()
{
        signal(SIGINT, sigroutine);//SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出
        pause();//在没有收到任何的信号的时候,pause相当于一个死循环,当收到任何一个信号的时候,就执行下一句
        sleep(3);
        printf("receive a signal \n");
}
阅读(1975) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~