• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 70, 文章 - 0, 評論 - 9, 引用 - 0
            數據加載中……

            可重入函數(reentrant function)

            原文地址:http://blog.chinaunix.net/space.php?uid=20491906&do=blog&cuid=322733

            由于cublog系統的緣故,將前段時間寫的一篇blog文章再次貼上。


            可重入函數這一概念早有接觸,但一直未有系統的理解,最近閱讀《APUE》信號一章時,其中講解很到位,故總結如下。

            信號作為一種軟中斷,能夠被進程給捕獲,因而也就中斷進程的正常執行,轉而去執行信號處理程序,最后再返回到原進程繼續正常執行。然而,當進程正在執行malloc()動態內存分配時,信號產生從而轉入到信號處理程序,但當信號處理程序中也用到了malloc()函數時,問題就出來了?因為malloc()通常維護一個所有已分配內存鏈表,當信號發生時,進程可能正在修改鏈表指針,這時在信號處理程序中將又一次修改鏈表。當然類似的情況還有不少,下文中將會談到。
             

            因此,在進行上層應用程序設計過程中我們就必須明確哪些函數是可重入性函數(reentrant functions)。可重入性函數通常也一定能夠在信號處理程序(signal handler)中被調用。
             

            1 能夠在信號處理程序中調用的可重入性函數(節自《APUE》)

            accept

            fchmod

            lseek

            sendto

            stat

            access

            fchown

            lstat

            setgid

            symlink

            aio_error

            fcntl

            mkdir

            setpgid

            sysconf

            aio_return

            fdatasync

            mkfifo

            setsid

            tcdrain

            aio_suspend

            fork

            open

            setsockopt

            tcflow

            alarm

            fpathconf

            pathconf

            setuid

            tcflush

            bind

            fstat

            pause

            shutdown

            tcgetattr

            cfgetispeed

            fsync

            pipe

            sigaction

            tcgetpgrp

            cfgetospeed

            ftruncate

            poll

            sigaddset

            tcsendbreak

            cfsetispeed

            getegid

            posix_trace_event

            sigdelset

            tcsetattr

            cfsetospeed

            geteuid

            pselect

            sigemptyset

            tcsetpgrp

            chdir

            getgid

            raise

            sigfillset

            time

            chmod

            getgroups

            read

            sigismember

            timer_getoverrun

            chown

            getpeername

            readlink

            signal

            timer_gettime

            clock_gettime

            getpgrp

            recv

            sigpause

            timer_settime

            close

            getpid

            recvfrom

            sigpending

            times

            connect

            getppid

            recvmsg

            sigprocmask

            umask

            creat

            getsockname

            rename

            sigqueue

            uname

            dup

            getsockopt

            rmdir

            sigset

            unlink

            dup2

            getuid

            select

            sigsuspend

            utime

            execle

            kill

            sem_post

            sleep

            wait

            execve

            link

            send

            socket

            waitpid

            _Exit & _exit

            listen

            sendmsg

            socketpair

            write

             

            縱觀上表,我們可以看出,有不少系統調用函數并沒有出現,換言之也就是非可重入性函數。函數不可重入的原因主要如下:

            <!--[if !supportLists]-->(1)       <!--[endif]-->函數使用了static靜態數據結構

            如:struct passwd *getpwuid(uid_t uid);

            struct passwd *getpwnam(const char *name);

            struct passwd *getpwent(void);

            以上3個函數都是返回一個指向passwd結構的指針,而該passwd結構通常都是函數中static變量,其內容在每次調用以上函數時都會被重寫。因此,當進程主程序與信號處理程序中均調用了以上函數時,沖突就產生了。

            <!--[if !supportLists]-->(2)       <!--[endif]-->函數調用了mallocfree函數,正如文章最開始所提到的;

            <!--[if !supportLists]-->(3)       <!--[endif]-->函數為標準I/O的庫函數,因為大多數的標準I/O庫函數的實現都使用了global全局數據結構;

            因此,若要寫可重入性函數的做法通常是我們在函數中只修改局部變量,而不改變全局變量,或盡量不使用全局變量、靜態static變量。

            事實上,與可重入性函數(reentrant function)對應的還有可重入內核(reentrant kernel),其區別和聯系在《深入理解Linux內核》上有較詳細的講解。



            posted on 2011-07-18 09:56 seahouse 閱讀(977) 評論(0)  編輯 收藏 引用 所屬分類: 技術概念

            欧美午夜A∨大片久久 | 久久久青草青青国产亚洲免观| 男女久久久国产一区二区三区| 97精品伊人久久大香线蕉| 久久久久久久综合狠狠综合| 精品久久久久久国产| 97超级碰碰碰久久久久| 久久久久国产精品嫩草影院| 欧美亚洲国产精品久久| 粉嫩小泬无遮挡久久久久久| 精品久久久久久无码中文字幕| 久久久精品国产| 99久久国产亚洲高清观看2024| 久久亚洲AV无码精品色午夜| 情人伊人久久综合亚洲| 日产精品久久久久久久| 久久精品一区二区国产| 亚洲国产成人久久一区WWW| 久久久久久国产精品免费无码 | 久久人爽人人爽人人片AV| 一级做a爰片久久毛片16| 亚洲国产精品无码久久久秋霞2| 伊人色综合久久天天| 久久精品午夜一区二区福利| 伊人久久大香线蕉无码麻豆| 99久久99久久精品国产| 国产V综合V亚洲欧美久久| 久久热这里只有精品在线观看| 久久激情亚洲精品无码?V| 国产午夜精品理论片久久影视 | 久久精品女人天堂AV麻| 久久久久中文字幕| 精品亚洲综合久久中文字幕| 久久丫精品国产亚洲av不卡| 久久久精品国产免大香伊| 伊人久久一区二区三区无码| 国产成人精品久久亚洲高清不卡 | 久久www免费人成看片| 伊人久久大香线蕉综合5g| 最新久久免费视频| 久久婷婷五月综合成人D啪|