home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / windows / x / 14340 < prev    next >
Encoding:
Text File  |  1992-07-24  |  4.0 KB  |  135 lines

  1. Path: sparky!uunet!olivea!apple!apple!netcomsv!mork!qualtrak
  2. From: qualtrak@netcom.com (Qual Trak)
  3. Newsgroups: comp.windows.x
  4. Subject: Xt and Signals Re-Re-Re-Revisited
  5. Summary: Signals under Xt - a technique.
  6. Keywords: Xt signal
  7. Message-ID: <#yhmwhc.qualtrak@netcom.com>
  8. Date: 24 Jul 92 15:49:49 GMT
  9. Reply-To: jb@QualTrak.COM
  10. Distribution: usa
  11. Organization: QualTrak Corporation
  12. Lines: 121
  13.  
  14.  
  15.     After reading the various articles and letters in TXJ and following
  16. some of the articles in this news group, I worked out the following code
  17. to use as a more or less generic signal handling package under Xt (in
  18. this case Motif).  I understand that all bets are off if I try and run
  19. this under SysVR3 or earlier (I'm hoping I don't have to) - But assuming
  20. the presence of BSD style signal handling Does anyone see any
  21. significant gotchas in using this model for signal handling.  I
  22. specifically need this code for forking () off children that write back
  23. to me via a pipe - I can add an input handler to read the pipe but I
  24. can't tell if the child died without catching SIGCHLD - Thus the need
  25. for something like this...
  26.  
  27.     As a quick overview the user call x_signal (signo, func) just as she
  28. would call signal ().  We're assuming that X initialization has already
  29. taken place.  X_signal () then initializes the signal catching routines
  30. by creating a pipe and installing x_sig_dispatcher () as a reader proc on
  31. that pipe with XtAppAddInput (). X_sig_handler () is then attached to
  32. the signal requested and the func argument is placed in the dispatch
  33. table.  When a signal arrives, x_sig_handler () writes the one byte
  34. signal number out to the pipe and returns.  X_sig_dispatcher is called
  35. out of XtAppMainLoop () as an XtInputEventCallbackProc and he reads the
  36. pipe, figures out which signal to call and if there's a valid handler in
  37. the dispatch table, it's called.
  38.  
  39. As I said before - I understand all bets are off with SysVR3 and earlier
  40. as well as other Operating Systems I may not know about.  At first blush
  41. this stuff appears to work in a robust manner (SunOS 4.1.2, X11R5, Motif
  42. 1.1.4) Does anybody see anything significantly wrong with the concept?
  43. Specifically does this share any of the problems associated with the
  44. Timer Callback and WorkProc solutions in terms of mucking with the
  45. internal state of X.
  46.  
  47. ------------------------------------------------------------------------
  48. #include <errno.h>
  49. #include <signal.h>
  50. #include <stdio.h>
  51. #include <X11/Intrinsic.h>
  52.  
  53. extern Widget toplevel;
  54.  
  55. typedef struct _tag_sig_dispatch
  56. {
  57.     void (*handler) ();
  58. } SignalDispatch;
  59.  
  60. static int SigInit = False;
  61. static int sig_fd [2] = { 0 };
  62.  
  63. static SignalDispatch sig_d_table [33] = { 0 };
  64.  
  65.  
  66.  
  67.  
  68. void
  69. x_sig_dispatcher (XtPointer client_data, int *fid, XtInputId *id)
  70. {
  71.     char sigbuf [1];
  72.     int  nread, signo;
  73.     if ((nread = read (*fid, sigbuf, 1)) == -1)
  74.         perror ("x_sig_dispatcher");
  75.     else
  76.     {
  77.         sigbuf [nread] = 0;
  78.         signo = (int) sigbuf [0];
  79.         if (signo > 0                           &&
  80.             signo < XtNumber (sig_d_table)      &&
  81.             sig_d_table [signo].handler != NULL    )
  82.             sig_d_table [signo].handler ();
  83.     }
  84. }
  85.  
  86.  
  87.  
  88.  
  89. static void
  90. x_sig_handler (sig)
  91. int sig;
  92. {
  93.     char buf [1];
  94.     buf [0] = (char) sig;
  95.     write (sig_fd [1], buf, 1);
  96. }
  97.  
  98.  
  99.  
  100.  
  101. void *
  102. x_signal (int signo, void (*handler) ())
  103. {
  104.     void ((*rval) ()) = NULL;
  105.  
  106.     if (signo > 0                      &&
  107.         signo < XtNumber (sig_d_table)    )
  108.     {
  109.         /*
  110.          * If it's a valid signal number
  111.          */
  112.         if (SigInit == False)
  113.         {
  114.             if (pipe (sig_fd) < 0)
  115.                 return SIG_DFL;
  116.             
  117.             XtAppAddInput (XtWidgetToApplicationContext (toplevel),
  118.                            sig_fd [0],
  119.                            (XtPointer) (XtInputReadMask | XtInputExceptMask),
  120.                            x_sig_dispatcher, NULL);
  121.             SigInit = True;
  122.         }
  123.         sig_d_table [signo].handler = handler;
  124.         rval = signal (signo, (handler != SIG_IGN && handler != SIG_DFL)?
  125.                        x_sig_handler:handler);
  126.     }
  127.     return rval;
  128. }
  129. /*
  130. ------------------------------------------------------------------------
  131. John Birchfield - QualTrak Corp (408) 730-2674 Home (408) 736-3852
  132. jb@QualTrak.COM
  133. ------------------------------------------------------------------------
  134. */
  135.