实验六 信号和pipe管道通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章 Linux 进程通信(6学时)
实验六信号和pipe管道通信
实验目的
1.了解和掌握Linux信号的原理
2.掌握Linux信号相关函数的使用
实验内容
1.运行以下程序,分析程序的运行结果及运行过程。
#include
#include
#include
static void sig_quit(int);
int
main(void)
{
sigset_t newmask, oldmask, pendingmask;
//设置对信号SIGQUIT的处理函数
if (signal(SIGQUIT, sig_quit) == SIG_ERR)
{
fprintf(stderr, "can't catch SIGQUIT\n");
exit(1);
}
//设置一个空的信号集
sigemptyset(&newmask);
sigaddset(&newmask, SIGQUIT); // 在这个信号集中增加SIGQUIT信号
//在当前进程中增加newmask信号集作为屏蔽信号集,oldmask返回当前进程的信号集 if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
{
fprintf(stderr, "SIG_BLOCK error\n");
exit(1);
}
for(i=1;i<6;i++){ printf("SIGQUIT信号现在被阻塞!\n");sleep(2);}
//恢复进程的信号集
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
{
fprintf(stderr, "SIG_SETMASK error\n");
exit(1);
}
printf("SIGQUIT unblocked\n");
sleep(5);
exit(0);
}
static void sig_quit(int signo)
{
printf("caught SIGQUIT/n");
//恢复进程对SIGQUIT的默认处理
if (signal(SIGQUIT, SIG_DFL) == SIG_ERR)
{
fprintf(stderr, "can't reset SIGQUIT\n");
exit(0);
}
}
(1)10秒钟内按下ctrl+\,观察输出,
(2)10秒之后再按下ctrl+\,输出?再次按下ctrl+\,程序输出?分析程序如何执行。
2、使用alarm,pause,signal函数,.编写程序sleep1,实现sleep函数的功能即输入sleep1 10 可睡眠10秒钟。其中用到的函数 int atoi(const char *nptr) 把字符串转换成整型数。参考课件ch4 P20-22
#include
#include
#include
#include
static void sig_alrm(int signo)
{
printf("睡眠结束!\n");
}
unsigned int sleep1(unsigned int nsecs)
{
if (signal(SIGALRM, sig_alrm) == SIG_ERR)
return(nsecs);
alarm(nsecs); /* 启动定时器*/
pause(); /* 暂停等待下一个信号来唤醒它*/ return(alarm(0)); /* 关闭计时器同时返回睡眠剩余的时间*/ }
main(int argc,char *argv[])
{
if(argc==2)
{
int nsecs=atoi(argv[1]);
printf("睡眠开始!\n");
sleep1(nsecs);
}
}