• <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>
            posts - 200, comments - 8, trackbacks - 0, articles - 0

                 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->struct  sembuf {    int sem_num;//下標(biāo)    in...  閱讀全文

            posted @ 2013-01-08 12:18 鑫龍 閱讀(377) | 評(píng)論 (0)編輯 收藏

            先看看 shmctl() 

              原型: int shmctl ( int shmqid, int cmd, struct shmid_ds *buf );

              返回:成功為 0 ,   失敗 為-1

             

            這個(gè)特殊的調(diào)用和semctl()調(diào)用幾乎相同,因此,這里不進(jìn)行詳細(xì)的討論。有效命令的值是: 

            IPC_STAT :檢索一個(gè)共享段的shmid_ds結(jié)構(gòu),把它存到buf參數(shù)的地址中。 

            IPC_SET :對(duì)一個(gè)共享段來(lái)說(shuō),從buf 參數(shù)中取值設(shè)置shmid_ds結(jié)構(gòu)的ipc_perm域的值。 

            IPC_RMID :把一個(gè)段標(biāo)記為刪除 


             IPC_RMID 命令實(shí)際上不從內(nèi)核刪除一個(gè)段,而是僅僅把這個(gè)段標(biāo)記為刪除,實(shí)際的刪除發(fā)生在最后一個(gè)進(jìn)程離開(kāi)這個(gè)共享段時(shí)。

            當(dāng)一個(gè)進(jìn)程不再需要共享內(nèi)存段時(shí),它將調(diào)用shmdt()系統(tǒng)調(diào)用卸載,即本進(jìn)程不再使用這個(gè)段,但是,這并不是從內(nèi)核真正地刪除這個(gè)段,而是把相關(guān)shmid_ds結(jié)構(gòu)的 shm_nattch域的值減1。真正把內(nèi)核中的共享內(nèi)存刪除還得用shmctl。

            posted @ 2013-01-06 13:08 鑫龍 閱讀(532) | 評(píng)論 (0)編輯 收藏

                 摘要: 一.基于文件的通信  1.普通文件(io/mmap)  2.有名管道文件  3.匿名管道  4.Socket二.基于內(nèi)存的通信  0.一組內(nèi)核內(nèi)存的工具    ipcs      ipcs -m&nb...  閱讀全文

            posted @ 2013-01-06 11:32 鑫龍 閱讀(429) | 評(píng)論 (0)編輯 收藏

            mmap函數(shù)是unix/linux下的系統(tǒng)調(diào)用。

            mmap系統(tǒng)調(diào)用并不是完全為了用于共享內(nèi)存而設(shè)計(jì)的。它本身提供了不同于一般對(duì)普通文件的訪問(wèn)方式,進(jìn)程可以像讀寫(xiě)內(nèi)存一樣對(duì)普通文件的操作。而Posix或系統(tǒng)V的共享內(nèi)存IPC則純粹用于共享目的,當(dāng)然mmap()實(shí)現(xiàn)共享內(nèi)存也是其主要應(yīng)用之一。
                      mmap系統(tǒng)調(diào)用使得進(jìn)程之間通過(guò)映射同一個(gè)普通文件實(shí)現(xiàn)共享內(nèi)存。普通文件被映射到進(jìn)程地址空間后,進(jìn)程可以像訪問(wèn)普通內(nèi)存一樣對(duì)文件進(jìn)行訪問(wèn),不必再調(diào)用read(),write()等操作。mmap并不分配空間, 只是將文件映射到調(diào)用進(jìn)程的地址空間里(因?yàn)椴⒉环峙淇臻g所以所映射的文件必須已經(jīng)具有大小,空文件會(huì)產(chǎn)生錯(cuò)誤), 然后你就可以用memcpy等操作寫(xiě)文件, 而不用write()了.寫(xiě)完后用msync()同步一下, 你所寫(xiě)的內(nèi)容就保存到文件里了. 不過(guò)這種方式?jīng)]辦法增加文件的長(zhǎng)度, 因?yàn)橐成涞拈L(zhǎng)度在調(diào)用mmap()的時(shí)候就決定了.

            posted @ 2013-01-06 10:37 鑫龍 閱讀(599) | 評(píng)論 (0)編輯 收藏

            sigaction/sigqueue是signal/kill的升級(jí)版

            1.sigqueue與kill:sigqueue可以發(fā)送額外參數(shù),kill不可以.

            2.sigaction與signal:signal通過(guò)sigaction實(shí)現(xiàn),sigaction除與signal一樣會(huì)屏蔽正在處理的信號(hào),還可以通過(guò)指定sa_mask屏蔽指定信號(hào)。

            3.sigaction與signal: sigaction還可以傳送信號(hào)相關(guān)的更多信息及參數(shù).

            4.上述4個(gè)函數(shù)可以混合使用.

            posted @ 2013-01-05 17:19 鑫龍 閱讀(349) | 評(píng)論 (0)編輯 收藏

                 摘要: 回顧:  1.信號(hào)的作用  2.理解信號(hào):     軟中斷     可靠與不可靠信號(hào)kill -l  3.信號(hào)發(fā)送與注冊(cè)kill/raise alarm  setitimer  signal  4.信...  閱讀全文

            posted @ 2013-01-05 16:03 鑫龍 閱讀(438) | 評(píng)論 (0)編輯 收藏

            轉(zhuǎn)發(fā)請(qǐng)注明出處:http://m.shnenglu.com/mysileng/admin/EditPosts.aspx?postid=196971
                剛寫(xiě)了程序發(fā)現(xiàn)點(diǎn)問(wèn)題。假設(shè)一個(gè)程序有多個(gè)線程,有一個(gè)全局互斥鎖M....在某線程A獲得鎖以后,這個(gè)時(shí)候來(lái)了一個(gè)信號(hào)(假設(shè)這個(gè)信號(hào)注冊(cè)了自己的處理程序),那么需要進(jìn)入信號(hào)處理程序,進(jìn)入以后信號(hào)處理處理程序也要獲得這個(gè)鎖。問(wèn)題來(lái)了?會(huì)死鎖么?
                我們知道同一線程如果重復(fù)申請(qǐng)同一個(gè)互斥鎖那么必然會(huì)死鎖?這里問(wèn)題轉(zhuǎn)換到信號(hào)處理函數(shù)跟之前的線程A會(huì)是同一個(gè)線程上下文么(即是同一個(gè)線程么)?我們?cè)囼?yàn)一下。實(shí)驗(yàn)之前需要明確幾點(diǎn):
                1.根據(jù)APUE 12.8,進(jìn)程的處理函數(shù)與處理方式是進(jìn)程中所有線程共享的。
                2.根據(jù)APUE 12.8,如果進(jìn)程接收到信號(hào),該信號(hào)只會(huì)被遞送到某一個(gè)單獨(dú)線程。一般情況下由那個(gè)線程引起信號(hào)則遞送到那個(gè)線程。如果沒(méi)有線程引發(fā)信號(hào),信號(hào)被發(fā)送到任意線程。



                 上面程序首先共享了一個(gè)共同的SIGUSR1信號(hào)處理函數(shù),主控線程A然后產(chǎn)生一個(gè)線程B,線程B首先獲得全局互斥鎖,然后運(yùn)行一個(gè)長(zhǎng)5秒的程序,然后釋放鎖。在B運(yùn)行了大概2秒的時(shí)候,線程A給本進(jìn)程(注意是進(jìn)程,而不是某線程)發(fā)送一個(gè)SIGUSR1信號(hào)。此時(shí),會(huì)死鎖么?編譯運(yùn)行看結(jié)果.

                連續(xù)運(yùn)行了5次,都沒(méi)有死鎖。我們分析一下,當(dāng)進(jìn)程接收信號(hào)時(shí),進(jìn)程把信號(hào)并沒(méi)有遞送給線程B(因?yàn)闆](méi)有產(chǎn)生死鎖),也就是說(shuō)是不是這個(gè)遞送過(guò)程被優(yōu)化了?還是我們真的運(yùn)氣好?需要進(jìn)一步探查。接下來(lái)我們指定把信號(hào)遞送給線程B,看會(huì)不會(huì)死鎖。

                接下來(lái)編譯運(yùn)行:

                不出意料,果然死鎖了。
                也就是說(shuō),關(guān)于線程與信號(hào)處理函數(shù)獲得同一把互斥鎖的問(wèn)題,關(guān)鍵是看信號(hào)被遞送給了那個(gè)線程,如果信號(hào)是被遞送給了獲得鎖的那個(gè)線程,就會(huì)死鎖,如果不是之前獲得鎖的線程,程序就繼續(xù)運(yùn)行。

            posted @ 2013-01-05 13:46 鑫龍 閱讀(1905) | 評(píng)論 (0)編輯 收藏

            原文地址:http://blogold.chinaunix.net/u1/48788/showart.php?id=2270724


            早期的信號(hào),也就是前32位的信號(hào),在處理信號(hào)時(shí),不具備阻塞該信號(hào)的能力(也就是不支持排隊(duì)),只能忽略,這時(shí)候就可能丟失信號(hào)。
            使用不可靠信號(hào)時(shí)注意:
            1) 不要在中斷函數(shù)中執(zhí)行過(guò)于復(fù)雜的處理流程;
            2) 在信號(hào)處理過(guò)程返回前,進(jìn)程會(huì)對(duì)相同信號(hào)的標(biāo)志進(jìn)行屏蔽;
            3) 父進(jìn)程會(huì)把當(dāng)前的信號(hào)屏蔽標(biāo)志位信息傳遞給它派生的子進(jìn)程。
             
             
             

            信號(hào)本質(zhì)

            信號(hào)是在軟件層次上對(duì)中斷機(jī)制的一種模擬,在原理上,一個(gè)進(jìn)程收到一個(gè)信號(hào)與處理器收到一個(gè)中斷請(qǐng)求可以說(shuō)是一樣的。信號(hào)是異步的,一個(gè)進(jìn)程不必通過(guò)任何操作來(lái)等待信號(hào)的到達(dá),事實(shí)上,進(jìn)程也不知道信號(hào)到底什么時(shí)候到達(dá)。

            信號(hào)是進(jìn)程間通信機(jī)制中唯一的異步通信機(jī)制,可以看作是異步通知,通知接收信號(hào)的進(jìn)程有哪些事情發(fā)生了。信號(hào)機(jī)制經(jīng)過(guò)POSIX實(shí)時(shí)擴(kuò)展后,功能更加強(qiáng)大,除了基本通知功能外,還可以傳遞附加信息。

            信號(hào)來(lái)源

            信號(hào)事件的發(fā)生有兩個(gè)來(lái)源:硬件來(lái)源(比如我們按下了鍵盤(pán)或者其它硬件故障);軟件來(lái)源,最常用發(fā)送信號(hào)的系統(tǒng)函數(shù)是kill, raise, alarm和setitimer以及sigqueue函數(shù),軟件來(lái)源還包括一些非法運(yùn)算等操作。

            二、信號(hào)的種類(lèi)

            可以從兩個(gè)不同的分類(lèi)角度對(duì)信號(hào)進(jìn)行分類(lèi):(1)可靠性方面:可靠信號(hào)與不可靠信號(hào);(2)與時(shí)間的關(guān)系上:實(shí)時(shí)信號(hào)與非實(shí)時(shí)信號(hào)。在《Linux環(huán)境進(jìn)程間通信(一):管道及有名管道》的附1中列出了系統(tǒng)所支持的所有信號(hào)。

            1、可靠信號(hào)與不可靠信號(hào)

            "不可靠信號(hào)"

            Linux信號(hào)機(jī)制基本上是從Unix系統(tǒng)中繼承過(guò)來(lái)的。早期Unix系統(tǒng)中的信號(hào)機(jī)制比較簡(jiǎn)單和原始,后來(lái)在實(shí)踐中暴露出一些問(wèn)題,因此,把那些建立在早期機(jī)制上的信號(hào)叫做"不可靠信號(hào)",信號(hào)值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信號(hào)都是不可靠信號(hào)。這就是"不可靠信號(hào)"的來(lái)源。它的主要問(wèn)題是:

            • 進(jìn)程每次處理信號(hào)后,就將對(duì)信號(hào)的響應(yīng)設(shè)置為默認(rèn)動(dòng)作。在某些情況下,將導(dǎo)致對(duì)信號(hào)的錯(cuò)誤處理;因此,用戶(hù)如果不希望這樣的操作,那么就要在信號(hào)處理函數(shù)結(jié)尾再一次調(diào)用signal(),重新安裝該信號(hào)。
            • 信號(hào)可能丟失,后面將對(duì)此詳細(xì)闡述。
              因此,早期unix下的不可靠信號(hào)主要指的是進(jìn)程可能對(duì)信號(hào)做出錯(cuò)誤的反應(yīng)以及信號(hào)可能丟失。

            Linux支持不可靠信號(hào),但是對(duì)不可靠信號(hào)機(jī)制做了改進(jìn):在調(diào)用完信號(hào)處理函數(shù)后,不必重新調(diào)用該信號(hào)的安裝函數(shù)(信號(hào)安裝函數(shù)是在可靠機(jī)制上的實(shí)現(xiàn))。因此,Linux下的不可靠信號(hào)問(wèn)題主要指的是信號(hào)可能丟失。

            "可靠信號(hào)"

            隨著時(shí)間的發(fā)展,實(shí)踐證明了有必要對(duì)信號(hào)的原始機(jī)制加以改進(jìn)和擴(kuò)充。所以,后來(lái)出現(xiàn)的各種Unix版本分別在這方面進(jìn)行了研究,力圖實(shí)現(xiàn)"可靠信號(hào)"。由于原來(lái)定義的信號(hào)已有許多應(yīng)用,不好再做改動(dòng),最終只好又新增加了一些信號(hào),并在一開(kāi)始就把它們定義為可靠信號(hào),這些信號(hào)支持排隊(duì),不會(huì)丟失。同時(shí),信號(hào)的發(fā)送和安裝也出現(xiàn)了新版本:信號(hào)發(fā)送函數(shù)sigqueue()及信號(hào)安裝函數(shù)sigaction()。POSIX.4對(duì)可靠信號(hào)機(jī)制做了標(biāo)準(zhǔn)化。但是,POSIX只對(duì)可靠信號(hào)機(jī)制應(yīng)具有的功能以及信號(hào)機(jī)制的對(duì)外接口做了標(biāo)準(zhǔn)化,對(duì)信號(hào)機(jī)制的實(shí)現(xiàn)沒(méi)有作具體的規(guī)定。

            信號(hào)值位于SIGRTMIN和SIGRTMAX之間的信號(hào)都是可靠信號(hào),可靠信號(hào)克服了信號(hào)可能丟失的問(wèn)題。Linux在支持新版本的信號(hào)安裝函數(shù)sigation()以及信號(hào)發(fā)送函數(shù)sigqueue()的同時(shí),仍然支持早期的signal()信號(hào)安裝函數(shù),支持信號(hào)發(fā)送函數(shù)kill()。

            注:不要有這樣的誤解:由sigqueue()發(fā)送、sigaction安裝的信號(hào)就是可靠的。事實(shí)上,可靠信號(hào)是指后來(lái)添加的新信號(hào)(信號(hào)值位于SIGRTMIN及SIGRTMAX之間);不可靠信號(hào)是信號(hào)值小于SIGRTMIN的信號(hào)。信號(hào)的可靠與不可靠只與信號(hào)值有關(guān),與信號(hào)的發(fā)送及安裝函數(shù)無(wú)關(guān)。目前l(fā)inux中的signal()是通過(guò)sigation()函數(shù)實(shí)現(xiàn)的,因此,即使通過(guò)signal()安裝的信號(hào),在信號(hào)處理函數(shù)的結(jié)尾也不必再調(diào)用一次信號(hào)安裝函數(shù)。同時(shí),由signal()安裝的實(shí)時(shí)信號(hào)支持排隊(duì),同樣不會(huì)丟失。

            對(duì)于目前l(fā)inux的兩個(gè)信號(hào)安裝函數(shù):signal()及sigaction()來(lái)說(shuō),它們都不能把SIGRTMIN以前的信號(hào)變成可靠信號(hào)(都不支持排隊(duì),仍有可能丟失,仍然是不可靠信號(hào)),而且對(duì)SIGRTMIN以后的信號(hào)都支持排隊(duì)。這兩個(gè)函數(shù)的最大區(qū)別在于,經(jīng)過(guò)sigaction安裝的信號(hào)都能傳遞信息給信號(hào)處理函數(shù)(對(duì)所有信號(hào)這一點(diǎn)都成立),而經(jīng)過(guò)signal安裝的信號(hào)卻不能向信號(hào)處理函數(shù)傳遞信息。對(duì)于信號(hào)發(fā)送函數(shù)來(lái)說(shuō)也是一樣的。

            2、實(shí)時(shí)信號(hào)與非實(shí)時(shí)信號(hào)

            早期Unix系統(tǒng)只定義了32種信號(hào),Ret hat7.2支持64種信號(hào),編號(hào)0-63(SIGRTMIN=31,SIGRTMAX=63),將來(lái)可能進(jìn)一步增加,這需要得到內(nèi)核的支持。前32種信號(hào)已經(jīng)有了預(yù)定義值,每個(gè)信號(hào)有了確定的用途及含義,并且每種信號(hào)都有各自的缺省動(dòng)作。如按鍵盤(pán)的CTRL ^C時(shí),會(huì)產(chǎn)生SIGINT信號(hào),對(duì)該信號(hào)的默認(rèn)反應(yīng)就是進(jìn)程終止。后32個(gè)信號(hào)表示實(shí)時(shí)信號(hào),等同于前面闡述的可靠信號(hào)。這保證了發(fā)送的多個(gè)實(shí)時(shí)信號(hào)都被接收。實(shí)時(shí)信號(hào)是POSIX標(biāo)準(zhǔn)的一部分,可用于應(yīng)用進(jìn)程。

            非實(shí)時(shí)信號(hào)都不支持排隊(duì),都是不可靠信號(hào);實(shí)時(shí)信號(hào)都支持排隊(duì),都是可靠信號(hào)。

            posted @ 2013-01-05 11:45 鑫龍 閱讀(318) | 評(píng)論 (0)編輯 收藏

                 摘要: 問(wèn)題解答:  1.exit(狀態(tài)碼)返回狀態(tài)碼有什么意義?   返回值被系統(tǒng)得到.系統(tǒng)根據(jù)狀態(tài)碼進(jìn)行日志記錄.   返回值被調(diào)用者得到:system/wait.程序會(huì)根據(jù)返回狀態(tài)碼進(jìn)行對(duì)應(yīng)處理。   exit(狀態(tài)碼)=main函數(shù)中的return 狀態(tài)碼;  &nbs...  閱讀全文

            posted @ 2013-01-04 10:42 鑫龍 閱讀(630) | 評(píng)論 (0)編輯 收藏

            首先看一下man的scandir 接口定義
            int scandir(const char *dir, struct dirent ***namelist,
                          int(*filter)(const struct dirent *),
                          int(*compar)(const struct dirent **, const struct dirent **));
            ,從定義來(lái)看就不是一個(gè)簡(jiǎn)單的函數(shù),形參里,出現(xiàn)一個(gè)三級(jí)指針,二個(gè)函數(shù)指針。它的功能是,掃描名字為dir的目錄,把滿(mǎn)足filter函數(shù)的過(guò)濾條件(即filter執(zhí)行為非0值)的目錄項(xiàng)加入到一維指針數(shù)組namelist.數(shù)組的總長(zhǎng)度為返回值n,如果compar不為空,則最終輸出結(jié)果還要調(diào)用qsort來(lái)對(duì)數(shù)組進(jìn)行排序后再輸出。
             
            從scandir的演示代碼,我們可以推算出namelist是一個(gè)指向一維指針數(shù)組的指針。(一維指針數(shù)組等同于 struct dirent ** namelist,這里寫(xiě)在三級(jí)指針是因?yàn)橐獜暮瘮?shù)里改變namelist的值,必須再多做一級(jí))原因可以參考我的函數(shù)傳值類(lèi)型的說(shuō)明。
             
            以下是一個(gè)簡(jiǎn)單掃描 /usr/lib,并且把所有以lib打頭的文件掃描到namelist數(shù)組的測(cè)試程序,這是參考scandir 提供的樣例來(lái)修改,alphasort是做原始的ASCII碼值比較進(jìn)行排序的
             
            可以看到namelist是完全動(dòng)態(tài)分配的,不僅數(shù)組本身是動(dòng)態(tài)分配,而且數(shù)組項(xiàng)指向的空間也是動(dòng)態(tài)分配的。
             
             

            #include <sys/types.h>
            #include <dirent.h>

            #include <sys/stat.h>
            #include <unistd.h>

            #include <stdio.h>
            #include <errno.h>
            #include <string.h>
            #include <stdlib.h>

            //掃描所有的lib打頭的文件

             int filter_fn(const struct dirent * ent)
             {
               if(ent->d_type != DT_REG)
                 return 0;
                 
               return (strncmp(ent->d_name,"lib",3) == 0);
             }


            void scan_lib(char * dir_name)
            {
              int n;
               struct dirent **namelist; // struct dirent * namelist[];

               n = scandir(dir_name, &namelist, filter_fn, alphasort);
               if (< 0)
                    perror("scandir");
               else {
                           while(n--) {
                               printf("%s\n", namelist[n]->d_name);
                               free(namelist[n]);
                           }
                           free(namelist);
                       }
            }

            int main(int argc ,char * argv[])
            {
               scan_lib("/usr/lib"); 
            }


            posted @ 2013-01-02 11:48 鑫龍 閱讀(3212) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共20頁(yè): First 5 6 7 8 9 10 11 12 13 Last 
            亚洲精品国产成人99久久| 婷婷久久综合九色综合绿巨人| 亚洲国产精品成人久久蜜臀| 久久人人爽人人人人爽AV| 欧洲人妻丰满av无码久久不卡| 香蕉久久夜色精品国产尤物| 亚洲国产精品久久久天堂| 69久久夜色精品国产69| 欧美伊人久久大香线蕉综合69 | 久久精品国产精品亚洲精品| 国产精品免费久久久久久久久| 噜噜噜色噜噜噜久久| 精品一区二区久久久久久久网站| 久久综合伊人77777麻豆| 久久久久亚洲精品无码蜜桃| 久久艹国产| 国产国产成人精品久久| 热久久最新网站获取| 国产精品免费看久久久香蕉| 久久精品夜夜夜夜夜久久| 亚洲伊人久久成综合人影院| 99久久无码一区人妻a黑| 国产69精品久久久久久人妻精品 | 久久国产精品成人影院| 热综合一本伊人久久精品| 久久综合综合久久97色| 久久精品国产亚洲AV无码偷窥| 久久综合亚洲色一区二区三区| 情人伊人久久综合亚洲| 亚洲国产精品无码久久久蜜芽 | 久久久久久国产精品无码下载| 国产精品18久久久久久vr| 性欧美丰满熟妇XXXX性久久久| 欧美亚洲国产精品久久| 香蕉久久永久视频| 亚洲а∨天堂久久精品| 久久精品成人免费国产片小草| 国产精品免费看久久久香蕉| 久久久久亚洲AV无码专区桃色| 品成人欧美大片久久国产欧美| 国内精品免费久久影院|