标签:
异常是控制流中的突变,用来响应处理器状态中的某些变化。
异常分为四类:中断、陷阱、故障和终止。
各种异常类型术语根据系统不同会有所不同,但对于每个系统,基本概念是相同的。
进程是计算机科学中最深刻最成功的概念之一。系统中的每个程序都是运行在某个进程的上下文中的。(上下文是由程序正确运行所需的状态组成的)
等待回收子进程
引入:一个进程可以通过调用waitpid函数来等待它的子进程终止或者停止
#include<sys/types.h>
#incldue<sys/wait.h>
pidt waitpid(pidt pid,int *status,int options);//如果成功,返回子进程的PID,如果为WNOHANG,则为0,其他错误则为-1
说明:默认地,即当options=0的时候,waitpid挂起调用进程的执行,直到它的等待集合中的一个子进程终止。如果等待集合中的一个进程在刚调用的时候就已经终止了,那么waitpid就立即返回。以上两种情况都会使得waitpid函数返回已经终止的子进程的PID,并且去除该进程。
判断等待集合的成员
如果pid>0,那么等待的集合就是一个单独的子进程,它的进程ID等于pid; 如果pid<-1,那么等待集合就是由父进程的所有子进程组成的
修改默认行为 可以通过将options设置为常量WNOHANG和WUNTRACED的各种组合,修改默认行为: WNOHANG:如果等待集合中的任何子进程都还没有都还没有终止,那么就立即返回0; WUNTRACED:挂起调用进程的执行,直到等待集合中的一个变成已经终止的或者被停止,然后返回导致返回的子进程的PID; WNOHANG|WUNTRACED:立即返回。
#include "csapp.h" #define N 2 int main() { int status,i; pidt pid; for(i =0;i<N;i++) if((pid = fork())==0) exit(100+i); while((pid = waitpid(-1,&status,0))>0) { if(WIFEXITED(status)) printf("child %d terminated normally with exit status = %d\n",pid,WEXITSTATUS(status)); else printf("child %d terminated abnormally\n",pid); } if(errno != ECHILD) unixerror("waitpid error"); exit(0); }
(1). 父进程创建N个子进程,然后子进程以一个唯一的退出状态退出;
(2).waitpid函数被阻塞直到某个子进程终止,然后进入while循环测试是否是正常终止的;是正常的话就输出;
(3).当回收了所有的子进程之后,再调用waitpid就返回-1,并且设置errno为ECHILD;如果不是正常终止的,就输出一个错误消息
#include <unistd.h> unsigned int sleep(unsigned int secs);
#include <unistd.h> int pause(void);
#include <unistd.h> int execve(const char *filename,const char *argv[],const char *envp[]);
Unix信号是一种更高层的软件形式的异常
信号术语
发送信号
(1). 用/bin/kill程序发送信号
unix> /bin/kill -9 15213
(2).从键盘发送信号
(3).用kill函数发送信号
#include "csapp.h" int main(){ pid_t pid; if ((pid = Fork()) == 0){ Pause(); printf("control should never reach here!\n"); exit(0); } Kill(pid,SIGKILL); exit(0); }
(4).用alarm函数发送信号
#include "csapp.h" void handler(int sig) { static int beeps = 0; printf("BEEP\n"); if (++beeps<5) Alarm(1); else{ printf("BOOM!\n"); exit(0); } } int main() { Signal(SIGALRM,handler); Alarm(1); while(1){ ; } exit(0); }
接收信号
(1)signal函数可以改变和信号signum相关联的行为
可移植的信号处理问题
(1)sigaction函数
本章节内容较多,一时间还不能完全消化,特别是对教材中代码的理解,还有进程调用结束的过程还需多看深化。
标签:
原文地址:http://www.cnblogs.com/ppph1995/p/4985906.html