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

📄 sesig.c

📁 功能丰富的串口通讯程序
💻 C
字号:
/* * This file is part of the Seyon, Copyright (c) 1992-1993 by Muhammad M. * Saggaf. All rights reserved. * * See the file COPYING (1-COPYING) or the manual page seyon(1) for a full * statement of rights and permissions for this program. *//* * signals - *	An Xt Intrinsics signal handler developed based on discussions *	in comp.windows.x and written by someone who wishes to be *	anonymous. [Modified by me -- M.S.] * *	A pipe is created and the read side is passed off to *	XtAppAddInput().  Everytime a signal occurs a byte, indicating *	which signal, is written by the signal handler on the write *	side of the pipe.  This causes the Intrinsics to call the *	input handler which then invokes the correct callback. * *	The potential for deadlock exists if the pipe is ever filled! * * $Id: signals.c,v 1.1 92/12/10 08:51:01 ware Exp $ * $Log:	signals.c,v $ * Revision 1.1  92/12/10  08:51:01  ware * Initial revision * */#include <X11/Intrinsic.h>#include <signal.h>		/* signal stuff */#include <unistd.h>#include <sys/types.h>		/* for pipe */#include <string.h>		/* for memset */#include "SeSig.h"#if __STDC__ == 1#if defined(SVR4)/* * This is a hack. On the system V release 4 unix, NSIG *is* defined * but it NOT defined if the compiler is in ANSI mode. Presumably the * use of this symbol should be avoided. */#ifndef NSIG#define NSIG (SIGXFSZ+1)#endif#endif#endifstatic _XoSignalData sig_info[NSIG + 1];	/* NSIG is max signal value */static int      pipefd[2];	/* the input & output pipes */static void     _xsig_handler(#if NeedFunctionPrototypes			       int sig,			       int code#endif);static void                _xsig_pipe_handler(#if NeedFunctionPrototypes				    XtPointer client_data,				    int *source,				    XtInputId * id#endif);/* * XoAppAddSignal - *	Install a handler for a particular signal.  There can be only *	a single handler per signal (it might be nice to use a callback). */XoSignalCallbackProcXoAppAddSignal(context, sig, handler, client_data)     XtAppContext    context;	/* application context */     int             sig;	/* which signal */     XoSignalCallbackProc handler;	/* the handler */     XtPointer       client_data;	/* private data */{  static int      firsttime = True;  /*	 * We need to create the pipe and tell the intrinsics about	 * the new file descriptor	 */  if (firsttime) {    firsttime = False;    pipe(pipefd);    XtAppAddInput(context, pipefd[0],		  (XtPointer) XtInputReadMask,		  _xsig_pipe_handler, (XtPointer) NULL);  }  sig_info[sig].handler = handler;  sig_info[sig].client_data = client_data;  return (XoSignalCallbackProc)signal(sig, (void (*)())_xsig_handler);}				/* XoAppAddSignal *//* * XoAppRemoveSignal - *	Uninstalls a handler for a particular signal.  The values *	of handler and client_data most match in order to remove the *	particular signal handler.  If there are no more remaining *	signal handlers for that signal then SIG_DFL is installed. * *	Of course, the current implementation only allows one handler *	per signal but in the future when multiple ones are added this *	will continue to work.  The application context is not used *	and is left merely for consistency. */voidXoAppRemoveSignal(context, sig)     XtAppContext    context;	/* application context */     int             sig;	/* which signal */{  signal(sig, SIG_DFL);	       /* restore old signal handler */  sig_info[sig].handler = (XoSignalCallbackProc) NULL;  sig_info[sig].client_data = NULL;}				/* XoAppRemoveSignal */voidXoAppIgnoreSignal(context, sig)     XtAppContext    context;	/* application context */     int             sig;	/* which signal */{  signal(sig, SIG_IGN);	       /* ignore signal */  sig_info[sig].handler = (XoSignalCallbackProc) NULL;  sig_info[sig].client_data = NULL;}				/* XoAppIgnoreSignal *//* * _xsig_handler - *	the actual signal handler (custom), writes a byte to a pipe */static void_xsig_handler(sig, code)     int             sig;     int             code;{  char            sig_value;  sig_value = sig;  write(pipefd[1], &sig_value, 1);}				/* _xsig_handler *//* * _xsig_pipe_handler - *	reads input from the pipe and executes the corresponding callback. */static void_xsig_pipe_handler(client_data, source, id)     XtPointer       client_data;     int            *source;     XtInputId      *id;{  unsigned char   sig_value;  int             sig;  read(pipefd[0], &sig_value, 1);  sig = sig_value;  if (sig > 0 && sig < NSIG && sig_info[sig].handler)    (*sig_info[sig].handler) (sig, sig_info[sig].client_data);}				/* _xsig_pipe_handler */

⌨️ 快捷键说明

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