zoukankan      html  css  js  c++  java
  • 2.3 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 文件

    1. #include <signal.h>  

    2. #include <stdio.h>  

    3. #include <unistd.h>  

    4.   

    5. void ouch(int sig)  

    6. {<pre name="code" class="cpp">      /*此处,signal(SIGINT,  SIG_DFL),SIG_DFL表示 ouch函数捕获到SIGINT信号,作出输出信息处理之后,恢复了SIGINT的默认行为*/</pre>  printf("OUCH! - I got signal %d ", sig);  

    7. <div><img src="file:///C:usersananaAppDataTencentUsers294299195QQWinTempRichOle}_J$7`I)~JBGVXP3]`BVX6U.jpg" alt=""></div>  

    8. (void) signal(SIGINT, SIG_DFL);}int main(){ (void) signal(SIGINT, ouch); while(1) { printf("Hello World! "); sleep(1); }}  

    9. <pre></pre>  

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

    11. <pre></pre>  

    12. <pre></pre>  

    程序会调用ouch()函数,输出信息,同时,回复sigint为默认行为(即按下artc+c组合键即结束运行)

    实例2:模仿闹钟行为

    函数1:

    #inlcude<sys/types.h>

    #include<signal.h>

    int kill (pid_t ,int sig);

    kill 函数的作用是把sig信号发送给表示为pid的进程,成功时返回0.失败时返回-1,要想发送一个信号,两个进程(发送和接受)必须同样拥有用户id,就是说,你只能向自己的另一个进程发送信号,但是超级用户可以向任何进程发送信号。

    函数2

    #include <unistd.h>

    unsigned int alarm (unsigned int seconds )  ;

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

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

    1. #include <signal.h>  

    2. #include <stdio.h>  

    3. #include <unistd.h>  

    4.   

    5. static int alarm_fired = 0;  

    6.   

    7. void ding(int sig)  

    8. {  

    9.     alarm_fired = 1;  

    10. }  

    11.   

    12.   

    13. int main()  

    14. {  

    15.     int pid;  

    16.   

    17.     printf("闹钟程序已经启动 ");  

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

    19.     if((pid = fork()) == 0) {  

    20.         sleep(5);  

    21.         kill(getppid(), SIGALRM);  

    22.         exit(0);  

    23.     }  

    24.   

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

    26.     printf("5秒后闹铃启动 ");  

    27.     (void) signal(SIGALRM, ding);  

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

    29.     pause();  

    30.     if (alarm_fired)  

    31.         printf("Ding! ");  

    32.   

    33.     printf("done ");  

    34.     exit(0);  

    35. }  

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

  • 相关阅读:
    LeetCode Path Sum II
    LeetCode Longest Palindromic Substring
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Binary Tree Maximum Path Sum
    LeetCode Find Peak Element
    LeetCode Maximum Product Subarray
    LeetCode Intersection of Two Linked Lists
    一天一个设计模式(1)——工厂模式
    PHP迭代器 Iterator
  • 原文地址:https://www.cnblogs.com/yjds/p/8598870.html
Copyright © 2011-2022 走看看