信号

项目 内容
这 个 作 业 属 于 哪 个 课 程 班 级 地 址
这个作业要求在哪里 作 业 要 求 地 址
学号-姓名 17041506-张政
学习目标 1.了解信号的概念 2.掌握信号处理的方法

1.编写一个简单的程序并运行,然后向该进程发送不同的信号以观察该进程对接收到信号的反应。

  • 代码如下:
  • 在终端1中运行代码,并分别向该进程发送信号 CTRL+C 、 CTRL+Z 、 CTRL+ ,观察进程的反应。
    如图1:
  • 在终端2中输入kill -l观察当前信号列表,并运行hellosignal文件
    如图2:
  • 得到pid3344后,在终端3输入kill -9 3344,查看终端2的进程反应
    如图3:

    如图4:
  • 注:推篇kill命令的博客。有个很有意思——init进程(硬件狗突然想到了“watchdog”),感兴趣可以自己去看看。
  • 来试试调用kill函数吧,代码如下:
    如图5:
  • 在终端1运行hellosignal,得3245
    如图6:
  • 在终端2运行mykill,并输入3245,查看终端1结果
    如图7:

    如图8:

2.使用signal()函数来捕捉信号。

  • 创建catchsignal文件,输入代码如下:
    图1:


  • 终端1运行catchsignal,分别输入 CTRL+C 、 CTRL+Z 、 CTRL+ ,观察进程的反应。得到3520。
    如图2:
  • 终端2输入如下kill命令
    如图3:
  • 终端1查看结果
    如图4:

3.通过举例说明alarm()函数和setitimer()函数的使用。

  • 使用alarm函数,代码如下:
    如图1:

  • alarm_test运行就是打印process will finish!,一秒后停止
  • 运行如下:
    如图2:
  • 使用setitimer()函数,代码如下:
    如图3:

  • 运行如下:
    如图4:
  • alarm()函数和setitimer()函数的区别
    alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。
    setitimer()支持3种类型的定时器:(1)ITIMER_REAL : 以系统真实的时间来计算,它送出SIGALRM信号。(2)ITIMER_VIRTUAL : -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。(3)ITIMER_PROF : 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。调用成功返回0,否则返回-1

4.举例说明信号集操作函数的使用。

  • 编写一个打印 sigset_t 的函数,后通常该函数查看,信号集操作函数对信号集操作后的结果。代码如下:
    如图1:


  • 运行结果:
    如图2:

5.举例说明对阻塞信号与未决信号的理解。

  • 程序思路是先把 SIGINT 、 SIGTSTP 加入到了进程阻塞信号集中去。接下来,每隔一秒打印一次未决信号集,第 10 次的时候,又把 SIGINT 信号从阻塞信号集中删除。代码如下:
    如图1:


  • 运行,分别发送信号 CTRL+C 、 CTRL+Z 、 CTRL+ ,观察,再在终端2输入kill -9 -33922结果:
    如图2:


6.举例说明sigaction()函数的使用。

  • 代码如下:
    如图1:


  • (1) 当程序运行的时候, Ctrl+C 进入 handler ,然后立即 Ctrl+Z 发现 handler 还未执行完就被 SIGTSTP 打断。(2) 当程序运行的时候, Ctrl+Z 进入 handler ,然后立即 Ctrl+C 发现并不会被 SIGINT 打断,这是因 为该 handler 注册的时候被设置了 SA_MASK = SIGINT 。最后 handler 结束的时候打印了未决信号集,发现里头有 SIGINT 。所以 handler 结束后,又去继续对 SIGINT 进行处理。运行结果:
    如图2:
原文地址:https://www.cnblogs.com/anhui-first-handsome/p/12943075.html