[LC++]Interrupt signals and streams - a bad mix?

Dr Mark H Phillips mark at austrics.com.au
Tue Feb 18 13:20:01 UTC 2003


Hi again,

Upon further experimentation I have come up with a simple
program which demonstrates the problem behaviour.  It appears
that the problem only arises if I create my own ostream variable
(and assign its buffer to be that of cout).  If I write directly
to cout the problem doesn't show itself.

This means that what I wrote before, namely:

> My collegue suspects that somewhere in my code I am overwriting
> illegal memory and that somehow this is showing up in the problems
> I've been having.

is unlikely to be correct.

It is curious though, as to why things work fine using cout directly,
but have problems when using a separate ostream variable pointed to
cout.

Below I enclose my test code which exhibits the problem.  (Well I
should add, it exhibits the problem under Intel Solaris - it seems
to work okay under Linux.)

Cheers,

Mark.

Code:

#include <csignal>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int windup = 0;
ostream myosm;         


void signalHandler(int sig);

int main(int argc, char** argv) {

  myosm.rdbuf(cout.rdbuf());

  // start signal detection
  signal(SIGHUP,  signalHandler);
  signal(SIGINT,  signalHandler);
  signal(SIGQUIT, signalHandler);
  signal(SIGILL,  signalHandler);
  signal(SIGABRT, signalHandler);
  signal(SIGFPE,  signalHandler);
  signal(SIGSEGV, signalHandler);
  signal(SIGPIPE, signalHandler);
  signal(SIGALRM, signalHandler);
  signal(SIGTERM, signalHandler);
  signal(SIGCHLD, signalHandler);
  signal(SIGCONT, signalHandler);
  signal(SIGTSTP, signalHandler);
  signal(SIGTTIN, signalHandler);
  signal(SIGTTOU, signalHandler);
  cerr<<"\nstarted interrupt signals detection"<<endl;

  while (1) {
    if (!myosm) {
      cerr<<"cout has failed!!\n";
      break;
    }
    myosm
      <<"this is a song which never ends; it just goes on and on my
friend;\n"
      <<flush;
  }

}

void signalHandler(int sig) {
  cerr<<"\ninterrupt signal "<<flush;
  switch (sig) {
  case SIGHUP:
    cerr<<"SIGHUP ("<<sig<<") received."<<endl;
    signal(sig, SIG_DFL);
    raise(sig);
    break;
  case SIGINT:
    cerr<<"SIGINT ("<<sig<<") received."<<endl;
    windup = 1;
    signal(sig, SIG_DFL);
    //    raise(sig);
    break;
  case SIGQUIT:
    cerr<<"SIGQUIT ("<<sig<<") received."<<endl;
    windup = 1;
    signal(sig, SIG_DFL);
    //    raise(sig);
    break;
  case SIGILL:
    cerr<<"SIGILL ("<<sig<<") received."<<endl;
    signal(sig, SIG_DFL);
    raise(sig);
    break;
  case SIGABRT:
    cerr<<"SIGABRT ("<<sig<<") received."<<endl;
    signal(sig, SIG_DFL);
    raise(sig);
    break;
  case SIGFPE:
    cerr<<"SIGFPE ("<<sig<<") received."<<endl;
    signal(sig, SIG_DFL);
    raise(sig);
    break;
  case SIGSEGV:
    cerr<<"SIGSEGV ("<<sig<<") received."<<endl;
    signal(sig, SIG_DFL);
    raise(sig);
    break;
  case SIGPIPE:
    cerr<<"SIGPIPE ("<<sig<<") received."<<endl;
    signal(sig, SIG_DFL);
    raise(sig);
    break;
  case SIGALRM:
    cerr<<"SIGALRM ("<<sig<<") received."<<endl;
    signal(sig, SIG_DFL);
    raise(sig);
    break;
  case SIGTERM:
    cerr<<"SIGTERM ("<<sig<<") received."<<endl;
    signal(sig, SIG_DFL);
    raise(sig);
    break;
  case SIGCHLD:
    cerr<<"SIGCHLD ("<<sig<<") received."<<endl;
    signal(sig, SIG_DFL);
    raise(sig);
    break;
  case SIGCONT:
    cerr<<"SIGCONT ("<<sig<<") received."<<endl;
    signal(SIGTSTP, signalHandler);
    signal(sig, signalHandler);
    break;
  case SIGTSTP:
    cerr<<"SIGTSTP ("<<sig<<") received."<<endl;
    signal(sig, SIG_DFL);
    raise(sig);
    break;
  case SIGTTIN:
    cerr<<"SIGTTIN ("<<sig<<") received."<<endl;
    signal(sig, SIG_DFL);
    raise(sig);
    break;
  case SIGTTOU:
    cerr<<"SIGTTOU ("<<sig<<") received."<<endl;
    signal(sig, SIG_DFL);
    raise(sig);
    break;
  default:
    cerr<<"unknown";
    signal(sig, SIG_DFL);
    raise(sig);
    break;
  }
}



-- 
Dr Mark H Phillips
Research Analyst (Mathematician)

AUSTRICS - smarter scheduling solutions - www.austrics.com

Level 2, 50 Pirie Street, Adelaide SA 5000, Australia
Phone +61 8 8226 9850
Fax   +61 8 8231 4821
Email mark at austrics.com.au




More information about the tuxCPProgramming mailing list