2010-01-06 21 views

Trả lời

0

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

15

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. 
+0

tài liệu đó không bao gồm thông tin bắt buộc về an toàn –

+0

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 –

+1

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

1

Đ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 đó.

+0

Tôi cần điều này trong bộ xử lý SIGSEGV SAU KHI sự cố ứng dụng. –

+0

Tôi muốn thư giãn ngăn xếp khi gặp sự cố –

0

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à forkexec 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. Khi exec -ing (sau fork -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ụng getppid; và trong phụ huynh, bạn cần phải wait để 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().

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().

Các vấn đề liên quan