进程互斥和信号通信_第1页
进程互斥和信号通信_第2页
进程互斥和信号通信_第3页
进程互斥和信号通信_第4页
进程互斥和信号通信_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

lockf()函数lockf用于锁定或打开锁定一个共享文件。将指定文件files的指定区域进行加锁或解锁,以解决临界资源文件的竞争问题。函数原型 lockf(files,function,size) files是文件描述符。 function是锁定和解锁;1表示锁定,0表示解锁。 size是锁定或解锁的字节数,若用0,表示从文件的当前位置到文件尾。使用lockf()函数实现资源互斥的方法是:…lockf();操作互斥资源代码;ulockf();…例如:lockf(stdout,1,0);//stdout是显示器资源,对显示器加锁printf(“childprocess2iskilledbyparent!\n”);//在显示器上输出lockf(stdout,0,0);//对显示器解锁进程通信

Linux中的每个进程有自己的虚拟地址空间,操作系统的一个最重要的基本管理目的,就是避免进程之间的互相影响。但有时用户也希望能够利用两个或多个进程的功能完成同一任务,为此,Linux提供许多机制,利用这些机制,进程之间可以进行通讯并共同完成某项任务,这种机制称为“进程间通讯(InterprocessCommunication,IPC)”。Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。Linux下进程间通信的主要手段信号(signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生除了用于进程间通信外,进程还可以发送信号给进程本身;共享内存(SharedMemory):使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。消息队列(message):消息队列是消息的链接表,包括Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。管道(pipe)及有名管道(namedpipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,允许无亲缘关系进程间的通信。信号的概念软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。收到信号的进程对各种信号有不同的处理方法。可以分为三类:类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。进程通过系统调用signal来指定进程对某个信号的处理行为。忽略某个信号,对该信号不做任何处理,就象未发生过一样。对该信号的处理保留系统的默认值信号信号是Unix系统中最古老的进程间通讯机制之一,它主要用来向进程发送异步的事件信号。键盘中断可能可产生信号浮点运算溢出可产生信号内存访问错误可产生信号。shell通常利用信号向子进程发送作业控制命令。进程不能向系统中所有的进程发送信号,一般而言,除系统和超级用户外,普通进程只能向具有相同uid(userID)和gid(groupID)的进程,或者处于同一进程组的进程发送信号。信号信号是1~64之间的数字,每个数字有特定含义,用来通知进程某一异步事件的发生。信号的名称在头文件signal.h中定义。01SIGHUP挂起02SIGINT中断,当用户从键盘按^c键或^break键时03SIGQUIT退出,当用户从键盘按quit键时04SIGILL非法指令05SIGTRAP跟踪陷阱,启动进程,跟踪代码的执行06SIGIOTIOT指令07SIGEMTEMT指令08SIGFPE浮点运算溢出09SIGKILL杀死、终止进程10SIGBUS总线错误11SIGSEGV段违例,进程试图去访问其虚地址空间以外的位置12SIGSYS系统调用中参数错,如系统调用号非法13SIGPIPE向某个非读管道中写入数据14SIGALRM闹钟。当某进程希望在某时间后接收信号时发此信号15SIGTERM软件终止16SIGUSR1用户自定义信号117SIGUSR2用户自定义信号2Signal()signal(设置信号处理方式)表头文件#include<signal.h>定义函数void(*signal(intsignum,void(*handler)(int)))(int);函数说明signal()会依参数signum指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。如果参数handler不是函数指针,则必须是下列两个常数之一:SIG_IGN忽略参数signum指定的信号。SIG_DFL将参数signum指定的信号重设为核心预设的信号处理方式。Exampleofsignal(),SIGINT#include<signal.h>#include<stdio.h>#include<unistd.h>voidouch(intsig){printf("OUCH!-Igotsignal%d\n",sig);//恢复SIGINT信号的处理动作

(void)signal(SIGINT,SIG_DFL);

}intmain(){//设置SIGINT信号的处理动作为响应ouch函数(void)signal(SIGINT,ouch);//主函数每隔1秒输出字符串while(1){printf("HelloWorld!\n");sleep(1);}}“不可靠信号”的主要问题是:进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。Exampleofsignal(),SIGALRM#include<unistd.h>#include<signal.h>voidhandler(){printf("hello\n");}main(){inti;

signal(SIGALRM,handler);alarm(5);for(i=1;i<7;i++){printf("sleep%d...\n",i);sleep(1);}}alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。Kill()系统调用kill用来向任何进程或进程组发送任何信号。定义函数intkill(pid_tpid,intsig);表头文件#include<sys/types.h>

#include<signal.h>函数说明如果参数pid是正数,那么该调用将信号sig发送到进程号为pid的进程。如果pid等于0,那么信号sig将发送给当前进程所属进程组里的所有进程。如果参数pid等于-1,信号sig将发送给除了进程1和自身以外的所有进程。如果参数pid小于-1,信号sig将发送给属于进程组-pid的所有进程。如果参数sig为0,将不发送信号。返回值执行成功时,返回值为0;错误时,返回-1,并设置相应的错误代码errno。Exampleofsignal(),kill(),pause()#include<signal.h>#include<stdio.h>#include<unistd.h>//闹钟未设置staticintalarm_fired=0;

//模拟闹钟voidding(intsig){ //设置闹钟alarm_fired=1;}intmain(){ intpid; printf("alarmapplicationstarting\n"); if((pid=fork())==0) {//子进程5秒后发送信号SIGALRM给父进程

sleep(5); kill(getppid(),SIGALRM); exit(0); }//父进程安排好捕捉到SIGALRM信号后执行ding函数

printf("waitingforalarmtogooff\n"); (void)signal(SIGALRM,ding); //挂起父进程,直到有一个信号出现

pause();if(alarm_fired) printf("Ding!\n"); printf("done\n"); exit(0);}pause(让进程暂停直到信号出现)表头文件#include<unistd.h>定义函数intpause(void);函数说明pause()会令目前的进程暂停(进入睡眠状态),直到被信号(signal)所中断。返回值只返回-1。Exampleofsignal(),kill(),pause()#include<unistd.h>#include<signal.h>#include<sys/types.h>#include<sys/wait.h>main(){pid_tpid;intstatus;if(!(pid=fork())){//子进程print

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论