2010-01-06 10 views
12

गैर syscall के रैपर से Async-सिग्नल सुरक्षित कार्य की एक सूची snprintf की तरह कुछ() dprintf) की जरूरत है, (मैं लेकिन glibc

+1

' आदमी 7 signal', वहाँ एक सूची होगा। – CodyChan

+0

आपने मेरे प्रश्न को नहीं समझा है। –

+1

फिर आपके द्वारा स्वीकार किए गए उत्तर में सामग्री 'मैन 7 सिग्नल' में क्यों है? – CodyChan

उत्तर

0

man 7 signal-safety के अंत में नवीनतम संस्करण रुचि सूची शामिल: और खोज `Async-संकेत safe` signal-safety.7.html

15

मैं बहुत यकीन है कि आप documentation

को देखने के लिए संपादित करें: फिर this list के बारे में कैसे?

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

कि दस्तावेज़ों में सुरक्षा के बारे में आवश्यक जानकारी शामिल नहीं है –

+0

कि सूची सिस्को की सूची है। मुझे यह बहुत याद है। लेकिन मुझे glibc –

+1

से फ़ंक्शंस की सूची की आवश्यकता है हां, उस सूची में ज्यादातर सिस्टम कॉल शामिल हैं, लेकिन यह है कि जीएलबीबीसी क्या है; एक __system__ इंटरफ़ेस_। मैं इसे लेता हूं कि अन्य मानक सी फ़ंक्शन __not__ सिग्नल सुरक्षित हैं क्योंकि वे यहां सूचीबद्ध नहीं हैं, या कम से कम मैं उन्हें सूचीबद्ध करने वाले अन्य (POSIX) मानकों के लिए _any_ आधिकारिक पॉइंटर्स नहीं ढूंढ पा रहा हूं। – Kimvais

1

यह निर्धारित करने के लिए मुश्किल लगता है, आप नहीं जानते कि क्या यादृच्छिक असुरक्षित समारोह एक पुस्तकालय दिनचर्या कॉल करने के लिए तय कर सकते हैं। यह सूची ग्लिब के विभिन्न संस्करणों के बीच अलग हो सकती है, या यदि आप इसे किसी अन्य यूनिक्स जैसी प्रणाली में ले जाते हैं। ऐसा लगता है कि आपको जवाब खोजने के लिए बहुत से कॉल स्टैक का विश्लेषण करना होगा, और यहां तक ​​कि यह संस्करण से संस्करण तक थोड़ा सा धक्का हो सकता है, distro से distro।

शायद आप वैकल्पिक डिजाइन दृष्टिकोण की तलाश नहीं कर रहे हैं, लेकिन ऐसा लगता है कि एक बेहतर रणनीति होगी: यदि आपके प्रोग्राम में इवेंट लूप है, सिग्नल हैंडलर को बहुत बेवकूफ बनाओ और बस कुछ राज्य स्थापित करें कि इवेंट लूप उठाएगा । इस तरह आप सिग्नल हैंडलर के बाहर सार्थक काम करते हैं।

उदाहरण: मान लें कि आपको poll() लूप कहीं मिला है। हो सकता है कि आप एक पाइप शामिल कर सकें जो सिग्नल हैंडलर लिख सकता है। फिर poll() लूप कुछ गैर-तुच्छ कार्य करता है जो उस पर संकेतित होने के आधार पर करता है।

+0

मुझे आवेदन की दुर्घटना के बाद एसआईजीएसईजीवी हैंडलर में इसकी आवश्यकता है। –

+0

मैं क्रैश पर ढेर खोलना चाहता हूं –

0

मुझे एप्लिकेशन के दुर्घटना के बाद SIGSEGV हैंडलर में इसकी आवश्यकता है।

  • आमतौर abort एक कोर डंप है, जो करने के लिए एक डिबगर के माध्यम से चलाया जा सकता है कारण होगा:

    मैं दुर्घटना

पर स्टैक आप एक स्टैक ट्रेस पर कब्जा करने के प्रयास कर रहे हैं चाहते हैं स्टैक ट्रेस का उत्पादन करें।

  • वैकल्पिक रूप से, एक कच्चे (लेकिन संकेत सुरक्षित) ऐसा करने का तरीका fork और exec के लिए एक अलग उपयोगिता (जैसे, "pstack") उत्पादन करने के लिए अपने दुर्घटनाग्रस्त हो गया काम का एक स्टैक ट्रेस किया जाएगा। जब exec -ing (fork -ing के बाद, बच्चे में), आपको getppid का उपयोग करके अपनी प्रक्रिया आईडी पास करनी होगी; और माता-पिता में abort पर कॉल करने से पहले, इसे समाप्त करने के लिए आपको wait की आवश्यकता होगी।

  • दूसरी ओर, यदि आप (जैसे सी ++ विनाशकर्ता कहा जाता हो सुनिश्चित करने, आदि) SIGSEGV के बाद एक "क्लीन" बाहर निकलें करने के लिए कोशिश कर रहे हैं - तो आप चेतावनी दी जानी चाहिए कि POSIX का कहना है:

    http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03_02:

    यह एक SIGFPE, SIGILL, SIGSEGV, या SIGBUS संकेत है कि मारने के द्वारा उत्पन्न नहीं किया गया था(), sigqueue() पर ध्यान नहीं देता, या बढ़ाने के बाद एक प्रक्रिया के व्यवहार अपरिभाषित है()।

    और http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03_03:

    बाद यह एक SIGBUS, SIGFPE, SIGILL, या SIGSEGV संकेत है कि द्वारा उत्पन्न नहीं किया गया था के लिए एक संकेत को पकड़ने समारोह से सामान्य रूप से देता है एक प्रक्रिया के व्यवहार अपरिभाषित है मारो(), sigqueue(), या उठाओ()।

    संबंधित मुद्दे