我註冊了一個處理程序SIGSEGV
,使用fprintf
打印一些消息,然後退出。該過程打印消息但沒有退出。它在exit()
之前被封鎖。SIGSEGV處理程序不能退出
我不能使用exit()
在處理程序中正常結束進程嗎?
void sigsegv__handler(){
fprintf(stderr, "SIGSEGV , TID: %d,PID: %d\n", TEST_ID, getpid());
exit(1);
}
我註冊了一個處理程序SIGSEGV
,使用fprintf
打印一些消息,然後退出。該過程打印消息但沒有退出。它在exit()
之前被封鎖。SIGSEGV處理程序不能退出
我不能使用exit()
在處理程序中正常結束進程嗎?
void sigsegv__handler(){
fprintf(stderr, "SIGSEGV , TID: %d,PID: %d\n", TEST_ID, getpid());
exit(1);
}
我不能使用
exit()
正常完成處理程序中的進程嗎?
exit()
不應該從信號處理程序調用,因爲它不能保證是異步信號安全的。改爲使用_exit()
,_Exit()
或abort()
。
也就是說,printf()
不應該從信號處理程序調用,出於同樣的原因,適用於exit()
。
有關函數是異步信號安全與否請有看不起這個頁面的完整列表:
而且,當發生分段違規時程序不穩定甚至破壞,堆棧可能會被搗毀,所以不能保證任何東西都可以被稱爲從那一刻開始。
在受控制的條件下,它可能是可能的,但總的來說,沒有。 exit
函數嘗試執行乾淨關閉,並要求進程處於正常狀態。由於生成了SIGSEGV,但沒有處理,所以代碼可能不是一種健全的狀態,因此不能保證乾淨的關閉工作。在這些情況下使用_exit
。
您也打電話給fprintf
。使用write
。
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()
非常感謝!我使用'kill()'而不是'exit()'。 –
避免的printf,你會喜歡閱讀本[「使用折返功能更安全的信號處理」(HTTP: //www.ibm.com/developerworks/linux/library/l-reent/index.html#N101CA) –