Linux C进程与多线程入门—(3)信号

概念

信号是系统响应某些状况而产生的事件,进程在接受到信号时会采取相应的行动。(非常像单片机的中断)信号可以明确地由一个进程产生发送到另外一个进程,用这种办法传递信息或协调操作行为。

进程可以生成信号、捕捉并相应信号或屏蔽信号。信号的名称是在头文件signal.h里定义。下面我列出一部分,如下:

———————————————————————————

信号名称                            说明

———————————————————————————

SIGALRM                         警告钟

SIGHUP                          系统挂断

SIGINT                           终端中断

SIGKILL                          停止进程(此信号不能被忽略或捕获)

SIGPIPE                          向没有读者的管道写数据

SIGQUIT                          终端退出

SIGTERM                         终止

———————————————————————————

如果进程接收到上表中的某个信号但实际并没有安排捕捉它,进程就会立刻终止。

  

函数

#include <signal.h>

void   (*signal(int sig,  void (*func)  (int) ))(int);

    这个函数看起来很复杂,但使用却是很简单的。第一个参数sig就是准备捕获或屏蔽的信号(看上表),接收到指定信号时将调用func函数处理。 

 

实例1—处理SIGINT(终端中断)信号

ctrlc.c文件

#include <signal.h>

#include <stdio.h>

#include <unistd.h>

void ouch(int sig)

{

      /*此处,signal(SIGINT,  SIG_DFL)SIG_DFL表示 ouch函数捕获到SIGINT信号,

     作出输出信息处理之后,恢复了SIGINT的默认行为*/

 printf("OUCH! - I got signal %d\n", sig);

 (void) signal(SIGINT, SIG_DFL); 

int main() { 

(void) signal(SIGINT, ouch); 

while(1) 

printf("Hello World!\n"); sleep(1);

 } 

}

这个程序就是截获组合键Ctrl+C产生的SIGINT信号。没有信号出现时,它每隔一秒就会输出一个消息。第一次按下Ctrl+C产生的SIGINT信号,

程序会调用ouch函数,输出信息,同时,恢复SIGINT为默认行为(即按下Ctrl+C组合键后即结束运行),那么第二次按下Ctrl+C组合键时,程序就结束了运行。

运行效果见下图:

 

 

 

 

 

 

 

实例2—模仿闹钟行为

函数1

#include <sys/types.h>

#include <signal.h>

 

int kill  (pid_t   pid,   int   sig);

kill函数的作用是把sig信号发送给标识为pid的进程,成功时返回“0”,失败时返回“-1”. 要想发送一个信号,两个进程(发送和接受两方)必须拥有同样的用户ID,,就是说,

你只能自己的另一个进程发送信号。但是超级用户可以向任何进程发送信号。

 

 

 

函数2

#include <unistd.h>

unsigned int alarm (unsigned int seconds )  ;

alarm函数是在seconds秒后安排发送一个SIGALARM信号。若seconds0,表示将取消全部已经设置的闹钟请求。每一个进程只有一个可用的闹钟。

它的返回值是一个闹钟闹响之前还需经过的剩余秒数。调用失败则返回“-1.

#include <signal.h>

#include <stdlib.h>

#include <stdio.h>

#include <unistd.h>

static int alarm_fired = 0;

void ding(int sig)

{

        alarm_fired = 1;

}

int main()

{

        int pid;

        printf("闹钟已启动。\n");

        /*子进程休眠5秒后向父进程发送SIGALARM信号,然后结束进程*/

        if((pid = fork()) == 0)

        {

                sleep(5);

                kill(getppid(), SIGALRM);

                exit(0);

        }

        /*父进程执行的内容*/

        printf("5秒后闹钟启动。\n");

        (void) signal(SIGALRM, ding);

        /*将运行的程序挂起,直到接收到信号为止*/

        pause();//让进程暂停知道信号出现

        if (alarm_fired)

                printf("Ding!\n");

        printf("done\n");

        exit(0);

}

程序通过fork启动一个新进程,这个子进程休眠5秒后向自己的父进程发送一个SIGALARM信号。父进程在安排好捕捉SIGALARM信号后暂停运行,直到接收到一个信号为止。
运行结果见下图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值