标签:过程 进程控制 运行 sap body 通过 linux信号 放弃 实例
异常是异常控制流的一种形式,他一部分由硬件实现,一部分由操作系统实现。
在任何情况下,当处理器检测到有事情发生时,他就会通过一张叫做异常表(exception table)的跳转表,进行一个简介过程调用(异常),到一个专门用来处理这类事件操作系统子程序(异常处理程序 exception handler)。当异常处理程序完成以后,根据引起异常的事件的类型,会发生以下3种情况的一种:
异常的类别:
类别 | 原因 | 异步/同步 | 返回行为 |
---|---|---|---|
中断 | 来自I/O设备的信号 | 异步 | 总是返回到下一条指令 |
陷阱 | 有意的异常,例如系统调用(syscall) | 同步 | 总是返回到下一条指令 |
故障 | 无意可恢复的错误,如页缺失 | 同步 | 有可能返回到当前指令 |
中止 | 无意不可恢复的错误 | 同步 | 不会返回 |
在故障异常处理中,例如页缺失。系统向内存请求一块内存页,当此页不再内存中时,会触发页缺失异常,此时调用处理页缺失异常的程序,向从磁盘中把缺失的页存入到内存中。若成功,则返回到当前指令,既重新请求内存页,此时不再触发页内存;若失败,则放弃请求该内存页,不返回当前指令。
异常是允许操作系统提供进程概念的基本构造块,进程是计算机科学中最深刻,成功的概念之一。
进程的经典定义就是一个执行种程序的实例。系统中的每个程序都运行在某个进程的上下文(context)之中。
进程提供给应用程序的关键抽象:
内核利用异常来支持进程上下文切换的异常控制流形式。
获取进程ID
#include <sys/types.h>
#include <unisted.h>
pid_t getpid(void);
pid_t getppod(void);
创建进程 fork函数,调用一次,返回两次,在父进程中返回生成的子进程的pid,在子进程中返回0;
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
pid_t pid;
int x = 1;
pid = fork();
if(pid == 0){
printf("child : x = %d\n", ++x);//child process
exit(0);
}
printf("parent : x = %d\n", --x);//parent process
return 0;
}
运行结果:
$ ./fork
parent : x = 0
child : x = 2
回收子进程
#include <sys/types.h>
#include <unistd.h>
pid_t waitpid(pid_t pid, int *statusp, int options);
//如果成功,则返回子进程的pid,如果WNOHANG,则为0,如果其他错误,则为-1.
加载并运行程序
#include <unistd.h>
int execve(const *filename, const char *argv[], const char *envp[]);
//如果成功则不返回,若错误,则返回-1;
一种更高层的软件形式的异常,成为Linux信号,它允许内核和进程中断其他进程。
标签:过程 进程控制 运行 sap body 通过 linux信号 放弃 实例
原文地址:https://www.cnblogs.com/LiShiZhen/p/11494440.html