我注册了一个SIGSEGV
信号的处理程序,使用fprintf
打印一些消息然后退出。进程打印出消息但没有退出,在exit()
之前被阻塞了。
在处理程序中不能使用exit()
正常结束进程吗?
void sigsegv__handler(){
fprintf(stderr, "SIGSEGV , TID: %d,PID: %d\n", TEST_ID, getpid());
exit(1);
}
我注册了一个SIGSEGV
信号的处理程序,使用fprintf
打印一些消息然后退出。进程打印出消息但没有退出,在exit()
之前被阻塞了。
在处理程序中不能使用exit()
正常结束进程吗?
void sigsegv__handler(){
fprintf(stderr, "SIGSEGV , TID: %d,PID: %d\n", TEST_ID, getpid());
exit(1);
}
exit()
正常结束进程吗?exit()
,因为它不能保证是异步信号安全的。应该使用_exit()
、_Exit()
或abort()
。printf()
也不应该从信号处理程序中调用。exit
试图进行干净的关闭并需要进程处于正常状态。由于产生了SIGSEGV但未处理,代码很可能处于不正常的状态,因此不能保证干净的关闭工作。在这种情况下使用_exit
。fprintf
的调用也是不明智的。应该使用write
。The following table defines a set of functions that shall be async-signal-safe. Therefore, applications can invoke them, without restriction, from signal-catching functions:
_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()
。 - wangbo15