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

📄 signal.c

📁 早期freebsd实现
💻 C
字号:
/* * Routines dealing with signals. * * A signal usually merely causes a bit to be set in the "signals" word. * At some convenient time, the mainline code checks to see if any * signals need processing by calling psignal(). * If we happen to be reading from a file [in iread()] at the time * the signal is received, we call intread to interrupt the iread. */#include "less.h"#include <signal.h>/* * "sigs" contains bits indicating signals which need to be processed. */public int sigs;#define	S_INTERRUPT	01#ifdef SIGTSTP#define	S_STOP		02#endif#if defined(SIGWINCH) || defined(SIGWIND)#define S_WINCH		04#endifextern int sc_width, sc_height;extern int swindow;extern int screen_trashed;extern int lnloop;extern int linenums;extern int scroll;extern int reading;/* * Interrupt signal handler. */	/* ARGSUSED*/	static HANDLERu_interrupt(type)	int type;{	SIGNAL(SIGINT, u_interrupt);	sigs |= S_INTERRUPT;	if (reading)		intread();}	public voidfake_interrupt(){	sigs |= S_INTERRUPT;}#ifdef SIGTSTP/* * "Stop" (^Z) signal handler. */	/* ARGSUSED*/	static HANDLERstop(type)	int type;{	SIGNAL(SIGTSTP, stop);	sigs |= S_STOP;	if (reading)		intread();}#endif#ifdef SIGWINCH/* * "Window" change handler */	/* ARGSUSED*/	public HANDLERwinch(type)	int type;{	SIGNAL(SIGWINCH, winch);	sigs |= S_WINCH;	if (reading)		intread();}#else#ifdef SIGWIND/* * "Window" change handler */	/* ARGSUSED*/	public HANDLERwinch(type)	int type;{	SIGNAL(SIGWIND, winch);	sigs |= S_WINCH;	if (reading)		intread();}#endif#endif/* * Set up the signal handlers. */	public voidinit_signals(on)	int on;{	if (on)	{		/*		 * Set signal handlers.		 */		(void) SIGNAL(SIGINT, u_interrupt);#ifdef SIGTSTP		(void) SIGNAL(SIGTSTP, stop);#endif#ifdef SIGWINCH		(void) SIGNAL(SIGWINCH, winch);#else#ifdef SIGWIND		(void) SIGNAL(SIGWIND, winch);#endif#endif	} else	{		/*		 * Restore signals to defaults.		 */		(void) SIGNAL(SIGINT, SIG_DFL);#ifdef SIGTSTP		(void) SIGNAL(SIGTSTP, SIG_DFL);#endif#ifdef SIGWINCH		(void) SIGNAL(SIGWINCH, SIG_IGN);#endif#ifdef SIGWIND		(void) SIGNAL(SIGWIND, SIG_IGN);#endif	}}/* * Process any signals we have received. * A received signal cause a bit to be set in "sigs". */	public voidpsignals(){	register int tsignals;	if ((tsignals = sigs) == 0)		return;	sigs = 0;#ifdef S_WINCH	if (tsignals & S_WINCH)	{		int old_width, old_height;		/*		 * Re-execute get_term() to read the new window size.		 */		old_width = sc_width;		old_height = sc_height;		swindow = -1;		get_term();		if (sc_width != old_width || sc_height != old_height)		{			scroll = (sc_height + 1) / 2;			screen_trashed = 1;		}	}#endif#ifdef SIGTSTP	if (tsignals & S_STOP)	{		/*		 * Clean up the terminal.		 */#ifdef SIGTTOU		SIGNAL(SIGTTOU, SIG_IGN);#endif		lower_left();		clear_eol();		deinit();		flush();		raw_mode(0);#ifdef SIGTTOU		SIGNAL(SIGTTOU, SIG_DFL);#endif		SIGNAL(SIGTSTP, SIG_DFL);		kill(getpid(), SIGTSTP);		/*		 * ... Bye bye. ...		 * Hopefully we'll be back later and resume here...		 * Reset the terminal and arrange to repaint the		 * screen when we get back to the main command loop.		 */		SIGNAL(SIGTSTP, stop);		raw_mode(1);		init();		screen_trashed = 1;	}#endif	if (tsignals & S_INTERRUPT)	{		bell();		/*		 * {{ You may wish to replace the bell() with 		 *    error("Interrupt", NULL_PARG); }}		 */		/*		 * If we were interrupted while in the "calculating 		 * line numbers" loop, turn off line numbers.		 */		if (lnloop)		{			lnloop = 0;			if (linenums == 2)				screen_trashed = 1;			linenums = 0;			error("Line numbers turned off", NULL_PARG);		}	}}

⌨️ 快捷键说明

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