欢迎来到天天文库
浏览记录
ID:21611552
大小:87.00 KB
页数:34页
时间:2018-10-19
《unix程序设计基础第三讲》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Unix程序设计基础第三讲谢翰2004-2-10Reviewsoflastclass进程独立地址空间的指令序列五种状态基本状态:新建,就绪,运行,睡眠,僵死状态转换图进程ID,子进程,父进程Unix下的多进程编程fork与execve:进程的创建与程序的运行wait,waitpid:回收子进程的退出状态Reviewsoflastclass信号是Unix操作系统用来通知进程发生了某种事件的一种手段。也称为软件中断几个常用的信号信号编程signal与sigaction:改变信号动作alarm:设置闹钟不可重入函数:在函数返回之前不可
2、再次被调用,如printf,malloc。信号编程(续)功能更强的改变信号动作函数:sigaction。解决早期signal函数的不可靠问题:在信号处理过程中再次收到这个信号怎么办?一般情况下用不到,请自己看书。发送信号函数kill与raise。函数原型:#includeintkill(pid_tpid,intsig);intraise(intsig);信号的发送kill给进程号为pid的进程发送一个sig信号pid>0:发送给进程ID为pid的进程pid==0:发送给与自己同组,并且自己有权限向其发送的进程pid<-1:发送给进程组I
3、D为-pid的进程,并且自己有权限向其发送的进程pid==-1:所有自己有权限向其发送信号的进程信号的发送raise调用给自己发关一个sig信号。因此,raise(sig);等价于kill(getpid(),sig);发送信号的shell命令:kill。在默认情况下发送的是SIGTERM信号$kill12345等价于$kill–TERM12345,都是向进程12345发送一个SIGTERM信号。$kill–KILL12345,向进程12345发送一个SIGKILL信号信号的屏蔽在一段时间内屏蔽掉某些信号,让当前进程接收不到这些信号。与忽略信号(rememb
4、er??)不同,被屏蔽的信号会被保存起来(但不排队),在屏蔽解除后会被进程收到。注意一点:一般情况下用signal函数设置信号动作,在某信号处理过程中,该信号是被屏蔽的。实例:SIGCHLD信号不详细讲关于信号屏蔽的系统调用,因为不是很重要,而且内容太多。但我想通过一个例子来让大家了解信号屏蔽:某个进程通过调用fork创建多个子进程:for(i=0;i5、s);但这就存在一个问题:只有当父进程结束子进程的状态才能被回收,子进程占用的进程表项才可以被释放。能不能子进程一结束就把它回收?实例:SIGCHLD信号回顾上一结,有一个信号叫做SIGCHLD,当子进程停止或结束,父进程将收到一个SIGCHLD信号,默认动作是忽略。我们自然会想到在SIGCHLD信号的处理函数中调用wait。于是:voidsig_chld(intsigno){intstatus;wait(&status);}实例:SIGCHLD信号当然我们还要设置SIGCHLD的处理函数:signal(SIGCHLD,sig_chld);好像已经大功告成6、,但实际上却存在问题。(程序演示)我们看到,系统中留下了很多僵死的进程,说明它们的退出状态并没有被回收,这是为什么?实例:SIGCHLD信号解答:前面说到,在信号处理过程中,相同的信号是被屏蔽的。也就是说,在sig_chld过程中进程是不会再收到SIGCHLD信号的。被屏蔽的信号被保存下来,在sig_chld返回之后进程会收到被屏蔽的信号。但是,被屏蔽信号的保存是不排队的,也就是说,进程知道在信号屏蔽过程中有没有收到这个信号,而无法知道收到几个。实例:SIGCHLD信号结果:父进程只回收到了某些子进程的退出状态。解决办法:这样子改写sig_chld函数:v7、oidsig_chld(intsigno){intstatus;while(waitpid(-1,&status,WNOHANG)>0);}进程间通信(IPC)著名Unix与网络专家RichardStevens,有多本Unix著作,本本经典。AdvancedProgrammingIntheUnixEnvironment(APUE)TCP/IPIllustratedvolume1,2,3UnixNetworkProgramming(UNP)volume1,21999年9月30号去世TT,UNPvolume3没有写完。进程间通信(IPC)UNPvolume2:8、用了一本书来讲IPC所以,我不可能在半节课之内涵盖IPC的各个方面
5、s);但这就存在一个问题:只有当父进程结束子进程的状态才能被回收,子进程占用的进程表项才可以被释放。能不能子进程一结束就把它回收?实例:SIGCHLD信号回顾上一结,有一个信号叫做SIGCHLD,当子进程停止或结束,父进程将收到一个SIGCHLD信号,默认动作是忽略。我们自然会想到在SIGCHLD信号的处理函数中调用wait。于是:voidsig_chld(intsigno){intstatus;wait(&status);}实例:SIGCHLD信号当然我们还要设置SIGCHLD的处理函数:signal(SIGCHLD,sig_chld);好像已经大功告成
6、,但实际上却存在问题。(程序演示)我们看到,系统中留下了很多僵死的进程,说明它们的退出状态并没有被回收,这是为什么?实例:SIGCHLD信号解答:前面说到,在信号处理过程中,相同的信号是被屏蔽的。也就是说,在sig_chld过程中进程是不会再收到SIGCHLD信号的。被屏蔽的信号被保存下来,在sig_chld返回之后进程会收到被屏蔽的信号。但是,被屏蔽信号的保存是不排队的,也就是说,进程知道在信号屏蔽过程中有没有收到这个信号,而无法知道收到几个。实例:SIGCHLD信号结果:父进程只回收到了某些子进程的退出状态。解决办法:这样子改写sig_chld函数:v
7、oidsig_chld(intsigno){intstatus;while(waitpid(-1,&status,WNOHANG)>0);}进程间通信(IPC)著名Unix与网络专家RichardStevens,有多本Unix著作,本本经典。AdvancedProgrammingIntheUnixEnvironment(APUE)TCP/IPIllustratedvolume1,2,3UnixNetworkProgramming(UNP)volume1,21999年9月30号去世TT,UNPvolume3没有写完。进程间通信(IPC)UNPvolume2:
8、用了一本书来讲IPC所以,我不可能在半节课之内涵盖IPC的各个方面
此文档下载收益归作者所有