2016-06-15 60 views
3

我註冊了一個處理程序SIGSEGV,使用fprintf打印一些消息,然後退出。該過程打印消息但沒有退出。它在exit()之前被封鎖。SIGSEGV處理程序不能退出

我不能使用exit()在處理程序中正常結束進程嗎?

void sigsegv__handler(){ 
    fprintf(stderr, "SIGSEGV , TID: %d,PID: %d\n", TEST_ID, getpid()); 
    exit(1); 
} 
+0

避免的printf,你會喜歡閱讀本[「使用折返功能更安全的信號處理」(HTTP: //www.ibm.com/developerworks/linux/library/l-reent/index.html#N101CA) –

回答

5

我不能使用exit()正常完成處理程序中的進程嗎?

exit()不應該從信號處理程序調用,因爲它不能保證是異步信號安全的。改爲使用_exit()_Exit()abort()

也就是說,printf()不應該從信號處理程序調用,出於同樣的原因,適用於exit()

有關函數是異步信號安全與否請有看不起這個頁面的完整列表:


而且,當發生分段違規時程序不穩定甚至破壞,堆棧可能會被搗毀,所以不能保證任何東西都可以被稱爲從那一刻開始。

2

在受控制的條件下,它可能是可能的,但總的來說,沒有。 exit函數嘗試執行乾淨關閉,並要求進程處於正常狀態。由於生成了SIGSEGV,但沒有處理,所以代碼可能不是一種健全的狀態,因此不能保證乾淨的關閉工作。在這些情況下使用_exit

您也打電話給fprintf。使用write

0

The list of functions POSIX requires是異步信號安全有:

下表定義了一組函數,應是 異步信號安全的。因此,應用程序可以調用它們,而不 限制,從信號捕獲功能:信號處理

_Exit() 
_exit() 
abort() 
accept() 
access() 
aio_error() 
aio_return() 
aio_suspend() 
alarm() 
bind() 
cfgetispeed() 
cfgetospeed() 
cfsetispeed() 
cfsetospeed() 
chdir() 
chmod() 
chown() 
clock_gettime() 
close() 
connect() 
creat() 
dup() 
dup2() 
execl() 
execle() 
execv() 
execve() 
faccessat() 
fchdir() 
fchmod() 
fchmodat() 
fchown() 
fchownat() 
fcntl() 
fdatasync() 
fexecve() 
fork() 
fstat() 
fstatat() 
fsync() 
ftruncate() 
futimens() 
getegid() 
geteuid() 
getgid() 
getgroups() 
getpeername() 
getpgrp() 
getpid() 
getppid() 
getsockname() 
getsockopt() 
getuid() 
kill() 
link() 
linkat() 
listen() 
lseek() 
lstat() 
mkdir() 
mkdirat() 
mkfifo() 
mkfifoat() 
mknod() 
mknodat() 
open() 
openat() 
pause() 
pipe() 
poll() 
posix_trace_event() 
pselect() 
pthread_kill() 
pthread_self() 
pthread_sigmask() 
raise() 
read() 
readlink() 
readlinkat() 
recv() 
recvfrom() 
recvmsg() 
rename() 
renameat() 
rmdir() 
select() 
sem_post() 
send() 
sendmsg() 
sendto() 
setgid() 
setpgid() 
setsid() 
setsockopt() 
setuid() 
shutdown() 
sigaction() 
sigaddset() 
sigdelset() 
sigemptyset() 
sigfillset() 
sigismember() 
signal() 
sigpause() 
sigpending() 
sigprocmask() 
sigqueue() 
sigset() 
sigsuspend() 
sleep() 
sockatmark() 
socket() 
socketpair() 
stat() 
symlink() 
symlinkat() 
tcdrain() 
tcflow() 
tcflush() 
tcgetattr() 
tcgetpgrp() 
tcsendbreak() 
tcsetattr() 
tcsetpgrp() 
time() 
timer_getoverrun() 
timer_gettime() 
timer_settime() 
times() 
umask() 
uname() 
unlink() 
unlinkat() 
utime() 
utimensat() 
utimes() 
wait() 
waitpid() 
write() 
+0

非常感謝!我使用'kill()'而不是'exit()'。 –

相關問題