- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
LINUX进程管理--进程通信
2
软中断
软中断是对硬件中断的一种模拟,发送软中断就是向接收进程的task_struct结构中的相应项发送一个信号。接收进程在收到软中断信号后,将按照事先的规定去执行一个软中断处理程序。但,软中断处理程序不像硬中断处理程序那样,收到中断信号后被启动,它必须等到接收进程执行时才生效。另,一个进程也可以对自己发送软中断信号,以便在某些特殊情况下,进程能转入规定好的处理程序。
3
4
Linux进程低级通信
Linux提供了同步、互斥及软中断的系统调用/库函数:
lockf(fd,function,size) 可用于互斥
fcntl 文件控制函数(根据文件描述词来操作文件的特性)。
wait() 用于父子进程间的同步
sleep(n) 使当前进程睡眠n秒后自动唤醒自己
kill(pid,sig)传递软中断信号
signal(sig,func)接收软中断信号
5
软中断信号预置函数
signal (sig , function)
sig —— 系统给定的软中断信号中的序号或名称。
function —— 与软中断信号关联的函数名,当进程在运行过程中捕捉到指定的软中断信号后,中断当前程序的执行转到该函数执行。
注意:软中断信号必须提前预置,然后才可以在程序运行中捕获。
6
发送软中断信号函数
int kill ( pid , sig )
pid——表示一个或一组进程的标识符:
当pid0时,将信号发送给指定pid的进程;
当pid=0时,将信号发送给同组的所有进程;
当pid=-1时,将信号发送给以下所有满足条件的进程:该进程用户标识符等于发送进程有效用户标识符;
sig——软中断信号的序号或名称
功能:向指定进程标识符pid的进程发软中断信号sig。本章中用来实现父进程给子进程发终止执行软中断信号。
头文件:
#includesys/types.h
#includesignal.h
7
[例] 编一程序实现循环显示字符串“Hello!”,当键盘键入Ctrl+C时终止循环,显示“OK!”后结束。
分析:
根据题意查系统的软中断信号表可知,需要定义的软中断信号序号为2,名称为SIGINT,其对应的软中断处理函数的功能是修改循环变量的值,使其中断返回后终止循环显示。
8
#includesignal.h
int k; //定义循环变量
void int_func(int sig) //定义软中断处理函数
{ k=0; //修改循环变量的值为0
}
main()
{
signal(SIGINT int_func);//预置软中断信号处理函数
k=1;
/*循环显示,等待键入Ctrl+c后转软中断处理函数执行*/
while(k==1)
printf(Hello!\n);
printf(“OK!\n”); //软中断处理函数返回后退出循环
exit(0);
}
9
上机练习-软中断1
编写一个程序循环输出“how are you?”,当键盘输入Ctrl+C时终止,当输出次数不超过350次时在此过程中使用Ctrl+C不能中断显示,350次后才能用Ctrl+C中断显示,然后输出“Byebye”.
10
在进程同步中,使用exit()和wait()实现了父进程等子进程终止的同步,但是这种同步方法不能实现子进程对父进程的等待。
要实现子进程对父进程的等待可以使用父进程向子进程发软中断信号,子进程接收信号的方式实现。
这两种同步方式相结合,可以实现父→子→父的同步序列。
11
实现父→子→父同步的步骤如下:
⑴子进程使用signal()预置软中断处理函数,然后等待父进程发软中断信号;
⑵父进程中使用kill()发软中断信号给子进程,再用wait(0)等待子进程结束;
⑶子进程接收到软中断信号后转去执行中断处理函数
⑷子进程在中断处理返回后,使用exit(0)终止执行,向父进程发终止信息。
⑸父进程使用wait(0)接收到子进程的终止信息后结束等待,并终止自己的程序的执行。
12
[例] 父子进程同步要求如下:
父进程创建一个子进程,在父进程中显示3行How are you ! 然后发软中断信号给子进程,再等待子进程终止后输出结束信息OK!,然后终止执行。
子进程中循环显示Im child ,当接收到父进程发来的软信号后停止循环,显示Child exited! 并终止执行。
它们之间的同步关系是:子进程在循环显示中等待父进程发出的软中断信号,并输出结束信息,然后结束;父进程等待子进程结束后输出结束信息,然后结束。
13
#includesignal.h
int k1; //定义全局变量k1
void int_fun1
文档评论(0)