⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 notetramp.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "../plan9/lib.h"#include "../plan9/sys9.h"#include <signal.h>#include <setjmp.h>/* A stack to hold pcs when signals nest */#define MAXSIGSTACK 20typedef struct Pcstack Pcstack;static struct Pcstack {	int sig;	void (*hdlr)(int, char*, Ureg*);	unsigned long restorepc;	Ureg *u;} pcstack[MAXSIGSTACK];static int nstack = 0;static void notecont(Ureg*, char*);void_notetramp(int sig, void (*hdlr)(int, char*, Ureg*), Ureg *u){	Pcstack *p;	if(nstack >= MAXSIGSTACK)		_NOTED(1);	/* nesting too deep; just do system default */	p = &pcstack[nstack];	p->restorepc = u->pc;	p->sig = sig;	p->hdlr = hdlr;	p->u = u;	nstack++;	u->pc = (unsigned long) notecont;	_NOTED(2);	/* NSAVE: clear note but hold state */}static voidnotecont(Ureg *u, char *s){	Pcstack *p;	void(*f)(int, char*, Ureg*);	p = &pcstack[nstack-1];	f = p->hdlr;	u->pc = p->restorepc;	nstack--;	(*f)(p->sig, s, u);	_NOTED(3);	/* NRSTR */}#define JMPBUFPC 1#define JMPBUFSP 0extern sigset_t	_psigblocked;voidsiglongjmp(sigjmp_buf j, int ret){	struct Ureg *u;	if(j[0])		_psigblocked = j[1];	if(nstack == 0 || pcstack[nstack-1].u->sp > j[2+JMPBUFSP])		longjmp(j+2, ret);	u = pcstack[nstack-1].u;	nstack--;	u->r0 = ret;	if(ret == 0)		u->r0 = 1;	u->pc = j[2+JMPBUFPC];	u->sp = j[2+JMPBUFSP] + 4;	_NOTED(3);	/* NRSTR */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -