Linux信号处理

1 实验目的

  1. 理解Linux的信号机制
  2. 学会编写信号发送和信号处理程序

2 背景知识

信号处理是linux程序的一个特色。用信号处理来模拟操作系统的中断功能。要想使用信号处理功能,你要做的就是填写一个信号处理函数即可。

要对一个信号进行处理,就需要给出此信号发生时系统所调用的处理函数。可以对一个特定的信号(除去SIGKILL和SIGSTOP信号)注册相应的处理函数。注册某个信号的处理函数后,当进程接收到此信号时,无论进程处于何种状态,就会停下当前的任务去执行此信号的处理函数。

Linux的信号处理函数如下:

  1. kill     发送信号SIGKILL给指定的进程或进程组
  2. raise    发送信号给进程或自身
  3. alarm    定时器信号设置,定时器时间到,会发送SIGALARM信号
  4. pause    等待信号,在信号来之前进程一直挂起
  5. signal     捕捉信号的函数

3实验内容

1、编写程序:用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(按^c 键);捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息,然后终止:

     child process1 is killed by parent!

     child process2 is killed by parent!

  父进程等待两个子进程终止后,输出如下的信息后终止:

      parent process is killed!

代码如下

#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
int wait_mark;
void waiting()
{
        while(wait_mark==1);
}
void stop()
{
        wait_mark=0;
}
int main()
{
    int p1,p2;
    while((p1=fork())==-1);
if(p1==0)
{
        wait_mark=1;
        signal(SIGINT,SIG_IGN);
        signal(16,stop);
        waiting();
        printf("Child Process11 is killed by parent!\n");
        exit(0);
}
else
{
    while((p2=fork())==-1)
    if(p2==0)
    {
        wait_mark=1;
        signal(SIGINT,SIG_IGN);
        signal(17,stop);
        waiting();
        printf("Child Process12 is killed by parent!\n");
        exit(0);
    }
    else
    {
        wait_mark=1;
        signal(SIGINT,stop);
        waiting();
        kill(p1,16);
        kill(p2,17);
        wait(0);
        wait(0);
        printf("Parent Process is killed!\n");
        exit(0);
    }
}
}

分析:程序开始调用fork()函数创建两个子进程,初始时两个子进程处于等待状态,再调用singal()函数让父进程捕捉键盘上来的中断信号(即按Ctrl+c键);当父进程捕捉到从键盘上传来的中断信号后,父进程调用Kill()函数向两个子进程发出信号,该信号的作用是让子进程从等待状态转为执行状态,子进程捕捉到该信号后分别执行各自的程序。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值