实验五 进程间通信——信号机制

一、实验目的

1、了解采用信号机制通信的原理;

2、掌握信号的使用方法。

二、实验内容

编写sigaction.c源程序,实现如下功能:

1、 a.捕获“Ctrl-C”信号时,打印”I have get SIGINT.”;

b.捕获“Ctrl-\”信号时,打印”I have get SIGQUIT.”。

2、 a.设置进程屏蔽字,本例中屏蔽信号SIGINT,并测试SIGINT是否被屏蔽,如果被屏蔽,输出“The SIGINT signal has been ignored”;

b.取消对SIGINT的屏蔽并挂起进程,然后再次按下“Ctrl-C”,查看结果。

三、源程序

sigaction.c:

#include<sys/types.h>

#include<sys/stat.h>

#include<unistd.h>

#include<fcntl.h>

#include<stdio.h>

#include<stdlib.h>

#include<errno.h>

#include<string.h>

#include<signal.h>

/*

pause()会令目前的进程暂停(进入睡眠状态), 直到被信号(signal)所中断

*/

// 函数原型声明

void print_1();

void print_2();

void print_4();

void handler(int sig);

// 主函数

int main(int argc, char *argv[])

{

    sigset_t sigset;

    struct sigaction act;

    // 初始化信号集合为空

    sigemptyset(&sigset);

    // 向信号中添加信号SIGINT

    sigaddset(&sigset,SIGINT);

    // 信号处理函数

    act.sa_handler=handler;

    // 设置信号集

    sigemptyset(&act.sa_mask);

    act.sa_flags=0;

    // 改变进程接收到特定信号后的行为

    if (sigaction(SIGINT, &act, NULL) < 0)

    {

        // 打印出错信息

        do {

            perror("sigaction error");

            exit(EXIT_FAILURE);

        } while(0);

    }  

    if (sigaction(SIGQUIT, &act, NULL) < 0)

    {

        // 打印出错信息

        do {

            perror("sigaction error");

            exit(EXIT_FAILURE);

        } while(0);

    }

    printf("\n等待信号中...\n");

    // 挂起进程 等待信号

    pause();

    pause();

    printf("\nCtrl+C屏蔽中\n");

    signal(SIGINT, print_4);

    // 挂起进程 等待信号

    pause();

    

    signal(SIGINT, handler);

    

    printf("\n屏蔽结束\n");

    printf("\n等待信号中...\n");

    pause();//挂起进程 等待信号

    return 0;

}

void handler(int sig)

{

    printf("\nrev sig=%d\n", sig);

    if(sig == SIGINT)

    {

        print_1();

    }

    else if(sig == SIGQUIT)

    {

        print_2();

    }

}

void print_1()

{

    printf("\nI have get SIGINT.\n");

}

void print_2()

{

    printf("\nI have get SIGQUIT.\n");

}

void print_4()

{

    printf("\nThe SIGINT signal has been ignored.\n");

}

四、实验步骤、结果截图

(1)使用GCC命令进行编译;

(2)运行并验证结果是否正确。结果如下:

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值