实验六 信号和pipe管道通信

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

}

相关文档
最新文档