Non syscall nhưng cái gì đó như snprintf(), dprintf()Tôi cần một danh sách các chức năng async-Signal-Safe từ glibc
Trả lời
phiên bản mới nhất của Cuối cùng man 7 signal-safety
chứa danh sách quan tâm: signal-safety.7.html
Tôi khá chắc chắn rằng bạn có để xem
documentation
Chỉnh sửa: Sau đó, khoảng this list thì sao?
Từ man signal
:
NOTES
The effects of this call in a multi-threaded process are unspecified.
The routine handler must be very careful, since processing elsewhere
was interrupted at some arbitrary point. POSIX has the concept of "safe
function". If a signal interrupts an unsafe function, and handler
calls an unsafe function, then the behavior is undefined. Safe func-
tions are listed explicitly in the various standards. The POSIX.1-2003
list is
_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() execle() execve() fchmod() fchown() fcntl() fdata-
sync() fork() fpathconf() fstat() fsync() ftruncate() getegid()
geteuid() getgid() getgroups() getpeername() getpgrp() getpid() getp-
pid() getsockname() getsockopt() getuid() kill() link() listen()
lseek() lstat() mkdir() mkfifo() open() pathconf() pause() pipe()
poll() posix_trace_event() pselect() raise() read() readlink() recv()
recvfrom() recvmsg() rename() rmdir() select() sem_post() send()
sendmsg() sendto() setgid() setpgid() setsid() setsockopt() setuid()
shutdown() sigaction() sigaddset() sigdelset() sigemptyset() sig-
fillset() sigismember() signal() sigpause() sigpending() sigprocmask()
sigqueue() sigset() sigsuspend() sleep() socket() socketpair() stat()
symlink() sysconf() tcdrain() tcflow() tcflush() tcgetattr() tcgetp-
grp() tcsendbreak() tcsetattr() tcsetpgrp() time() timer_getoverrun()
timer_gettime() timer_settime() times() umask() uname() unlink()
utime() wait() waitpid() write().
According to POSIX, the behaviour of a process is undefined after it
ignores a SIGFPE, SIGILL, or SIGSEGV signal that was not generated by
the kill(2) or the raise(3) functions. Integer division by zero has
undefined result. On some architectures it will generate a SIGFPE sig-
nal. (Also dividing the most negative integer by -1 may generate
SIGFPE.) Ignoring this signal might lead to an endless loop.
See sigaction(2) for details on what happens when SIGCHLD is set to
SIG_IGN.
The use of sighandler_t is a GNU extension. Various versions of libc
predefine this type; libc4 and libc5 define SignalHandler, glibc
defines sig_t and, when _GNU_SOURCE is defined, also sighandler_t.
tài liệu đó không bao gồm thông tin bắt buộc về an toàn –
danh sách đó là danh sách các syscalls. Tôi nhớ nó khá. nhưng tôi cần danh sách các chức năng từ glibc –
Có, danh sách đó bao gồm chủ yếu là các cuộc gọi hệ thống, nhưng đó là những gì GLIBC là; giao diện __system___. Tôi nhận thấy rằng các hàm C tiêu chuẩn khác là __not__ tín hiệu an toàn vì chúng không được liệt kê ở đây, hoặc ít nhất tôi không thể tìm thấy các con trỏ định nghĩa _any_ tới các tiêu chuẩn khác (POSIX) liệt kê chúng. – Kimvais
Điều này có vẻ khó khăn để xác định, như bạn không biết những gì chức năng không an toàn ngẫu nhiên một thói quen thư viện có thể quyết định gọi. Danh sách cũng có thể khác nhau giữa các phiên bản khác nhau của glibc, hoặc nếu bạn mang nó đến một hệ thống giống Unix khác. Có vẻ như bạn phải phân tích rất nhiều ngăn xếp cuộc gọi để tìm câu trả lời và thậm chí điều đó có thể hơi run rẩy từ phiên bản này đến phiên bản khác, gây phân tán.
Có lẽ bạn không tìm kiếm các phương pháp thiết kế thay thế, nhưng có vẻ như chiến lược tốt hơn là: nếu chương trình của bạn có vòng lặp sự kiện, hãy xử lý tín hiệu rất ngu ngốc và chỉ thiết lập một số trạng thái mà vòng lặp sự kiện sẽ nhận . Bằng cách đó bạn thực hiện công việc có ý nghĩa bên ngoài trình xử lý tín hiệu.
Ví dụ: Giả sử bạn có vòng lặp poll()
ở đâu đó. Có lẽ bạn có thể bao gồm một đường ống mà bộ xử lý tín hiệu có thể ghi vào. Sau đó, vòng lặp poll()
thực hiện một số công việc không tầm thường dựa trên việc được báo hiệu bởi điều đó.
Tôi cần điều này trong bộ xử lý SIGSEGV SAU KHI sự cố ứng dụng. –
Tôi muốn thư giãn ngăn xếp khi gặp sự cố –
Tôi cần điều này trong bộ xử lý SIGSEGV SAU KHI sự cố ứng dụng.
Tôi muốn thư giãn chồng về vụ tai nạn
Nếu bạn đang cố gắng để nắm bắt một stack trace:
thường
abort
sẽ gây ra một bãi chứa lõi, có thể được chạy qua một trình gỡ lỗi để tạo ra dấu vết ngăn xếp.Cách khác, cách làm thô (nhưng an toàn) là
fork
vàexec
một tiện ích riêng biệt (ví dụ: "pstack") để xuất một dấu vết ngăn xếp của tác vụ bị lỗi. Khiexec
-ing (saufork
-ing, ở trẻ em), bạn cần phải chuyển ID tiến trình của mình bằng cách sử dụnggetppid
; và trong phụ huynh, bạn cần phảiwait
để hoàn thành, trước khi gọi sốabort
.
Mặt khác, nếu bạn đang cố gắng để làm một lối ra "sạch" sau SIGSEGV (ví dụ Việc đảm bảo C++ hàm hủy được gọi, vv) - thì bạn nên được cảnh báo rằng POSIX nói:
http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03_02:
hành vi của một quá trình là undefined sau khi nó bỏ qua một SIGFPE, SIGILL, SIGSEGV, hoặc tín hiệu SIGBUS mà không được tạo ra bởi kill(), sigqueue(), hoặc huy động().
và http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03_03:
Hành vi của một quá trình là undefined sau nó sẽ trả về bình thường từ một hàm tín hiệu bắt cho một SIGBUS, SIGFPE, SIGILL, hoặc SIGSEGV tín hiệu mà không được tạo ra bởi kill(), sigqueue() hoặc tăng().
'người đàn ông 7 signal' và tìm kiếm' async-tín hiệu-safe', sẽ có một danh sách. – CodyChan
Bạn chưa hiểu câu hỏi của tôi. –
Tại sao nội dung trong câu trả lời bạn chấp nhận nằm trong 'tín hiệu người đàn ông 7 '? – CodyChan