*BSD News Article 19370


Return to BSD News archive

Xref: sserve comp.unix.ultrix:19127 comp.unix.bsd:12381
Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!agate!doc.ic.ac.uk!pipex!uunet!utcsri!relay.cs.toronto.edu!smoke.cs.toronto.edu!cs.toronto.edu!chris
Newsgroups: comp.unix.ultrix,comp.unix.bsd
From: chris@cs.toronto.edu (Chris Beck)
Subject: Signal catching probleem
Message-ID: <93Aug10.191758edt.858@smoke.cs.toronto.edu>
Organization: Department of Computer Science, University of Toronto
Date: 10 Aug 93 23:18:16 GMT
Lines: 75


I've got a signal handling problem that I can't see my way around.  Any
help that can be given is greatly appreciated.

I have a process that receives signals from outside.  There are 2 possible
sequences of signals that will arrive at the particular point in the
process.  Either:
	SIGUSR1, SIGUSR2, SIGUSR1
or:
	SIGUSR2, SIGUSR1

I want to treat the SIGUSR1 after the SIGUSR2 differently than I treat the
first one (if there is a first one).  So the set-up I have is this:


int sig2_arrived;

main(){
...

  /* set original catcher */
  signal(SIGUSR1,catcher1);
  signal(SIGUSR2,catcher1);
...

  /* block and wait for a signal */
  sig2_arrived = 0;
  oldmask = sigblock(sigmask(SIGUSR1) | sigmask(SIGUSR2));
  while (!sig2_arrived) sigpause(sigmask(0));

  /* set new catcher for SIGUSR1 */
  signal(SIGUSR1,catcher2);
...
}

void catcher1(int sig_num){

  if (sig_num == SIGUSR1){

     /* do something that does not use sig2_arrived */

  }

  if (sig_num == SIGUSR2){

    sig2_arrived = 1;
  }
}

void catcher2(int sig_num){

  if (sig_num == SIGUSR1){

     /* do something different than above */

  }

}

The problem is that the second SIGUSR1 might arrive while SIGUSR2 is being
processed (before sigpause() returns). I want to process SIGUSR2 without
being interrupted by SIGUSR1, but I also want to be able to receive
SIGUSR1 if it comes before SIGUSR2 - so sigpause(sigmask(SIGUSR1)) won't
help.  Doing something like moving the installation of catcher2 inside of
catcher1 and/or attempting to block SIGUSR1 inside of catcher1 won't
guarantee not being interrupted (because of the non-atomic commands that
are necessary).

Anybody got any ideas?

Thanks,
Chris 

>>>>>>>>>> Sentio nos in Kansate non iam adesse, Totus. <<<<<<<<<<<<<<<<<<<<
Chris Beck						chris@cs.utoronto.ca