[TECH] Standard I/O Buffers won’t get flushed when program crashes…

Today I had a interesting problem, assume that you have a program printing out some
details on to the screen and suddenly the program crashes and you want to capture what
ever it has printed what would you do? you would try to redirect the output to a file and look at that file and what if the contents of the redirected file is empty? how do you explain this? try the following program and try to redirect what ever it prints using ‘>’ or a ‘|’ (“./a.out > out” or “./a.out | more”)


char *crash_me = "crash this";
int main(){
    int i;  

    for(i=0;i out
#3$./a.out | more

We can see that the ‘out’ file and ‘more’ don’t show any thing which was in fact printed if we just run the program normally, how can we explain this? what exactly is
happened? actually this is what has happened in the first case the terminal output is
line buffered when ever terminal sees ‘\n’ it prints that but in the next two cases
the output is written to a file which is not line buffered (but gets written when
the buffer is full) and since the program is crashed before the buffer gets full nothing is printed in case of #2 and #3. I guess one should definitely have a signal
handler for SIGSEGV and other signals which end the program and do a explicit flush as below.


/*The buffers should be flushed before
 *program crashes.
 **/
void FlushBuffers(int sig){
    fprintf(stderr,"Segmentation Fault\n");
    fflush(stdout);fflush(stderr);
    exit(1);

}
char *crash_me = "crash this";
int main(){
    int i;
    assert(signal(SIGSEGV,FlushBuffers)!=SIG_ERR);
    for(i=0;i<10;i++){
        printf("Before crash line %d\n",i+1);
        if(i==9){
            crash_me[6] = 'C';
        }
    }
}

I’m thinking of making a list of this kind of problems on UNIX

~ by Vamsi Kundeti on February 12, 2008.

Leave a Reply