[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