2006년 11월 23일 목요일

signal 처리 중에 signal이 발생하면?

이것저것 더 테스트 해봐야하지만, signal 처리 시 signal 이 발생하면 무슨 일이 생길까?

sf.cpp 원문
#include <signal.h>
#include <iostream>
using namespace std;

void
sigFunc(int sig)
{
        cerr << "SIGNUM: " << sig << endl;
        cerr << "I'll make segmentation fault" << endl;
/*
        char* p(NULL);
        *p = 20;
*/
        abort();
}

int
main(int,char**)
{
        signal(SIGSEGV, sigFunc);
        char* p(NULL);
        *p = 20;
        return 0;
}

컴파일
$ g++ -g -o sf sf.cpp


실행
./sf
SIGNUM: 11
I'll make segmentation fault
Aborted (core dumped)


디버깅

$gdb -c core.24262 ./sf
GNU gdb Red Hat Linux (6.3.0.0-1.63rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1".

Core was generated by `./sf'.
Program terminated with signal 6, Aborted.
Reading symbols from /usr/lib/libstdc++.so.6...done.
Loaded symbols for /usr/lib/libstdc++.so.6
Reading symbols from /lib/tls/libm.so.6...done.
Loaded symbols for /lib/tls/libm.so.6
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0  0x0043b7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
(gdb) bt
#0  0x0043b7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1  0x0047b7d5 in raise () from /lib/tls/libc.so.6
#2  0x0047d149 in abort () from /lib/tls/libc.so.6
#3  0x080488ce in sigFunc (sig=11) at sf.cpp:14
#4  <signal handler called>
#5  0x08048906 in main () at sf.cpp:22
(gdb)
만약 주석부분을 풀었다면?
$ gdb -c core.24395 ./sf
GNU gdb Red Hat Linux (6.3.0.0-1.63rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1".

Core was generated by `./sf'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/lib/libstdc++.so.6...done.
Loaded symbols for /usr/lib/libstdc++.so.6
Reading symbols from /lib/tls/libm.so.6...done.
Loaded symbols for /lib/tls/libm.so.6
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0  0x080488d3 in sigFunc (sig=11) at sf.cpp:12
12              *p = 20;
(gdb) bt
#0  0x080488d3 in sigFunc (sig=11) at sf.cpp:12
#1  <signal handler called>
#2  0x08048914 in main () at sf.cpp:22
(gdb)

아무래도 그래야겠지?