国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

linux c之管道的介紹、創(chuàng)建關(guān)閉和簡(jiǎn)單讀寫

2019-11-11 02:00:43
字體:
供稿:網(wǎng)友

1、管道介紹、

       進(jìn)程間通信的幾種主要手段中。其中管道和有名管道是最早的進(jìn)程間通信機(jī)制之一,管道可用于具有親緣關(guān)系進(jìn)程間的通信,有名管道克服了管道沒有名字的限制,因此,除具

      有管道所具有的功能外,它還允許無親緣關(guān)系進(jìn)程間的通信。

 2、管道特點(diǎn)、

       管道是半雙工的,數(shù)據(jù)只能向一個(gè)方向流動(dòng);需要雙方通信時(shí),需要建立起兩個(gè)管道; 只能用于父子進(jìn)程或者兄弟進(jìn)程之間(具有親緣關(guān)系的進(jìn)程);單獨(dú)構(gòu)成一種獨(dú)立的文件系統(tǒng):管道對(duì)于管道兩端的進(jìn)程而言,就是一個(gè)文件,但它不是普通的文件,它不屬于某種文件系統(tǒng),而是自立門戶,單獨(dú)構(gòu)成一種文件系統(tǒng),并且只存在與內(nèi)存中。

                   

3、 數(shù)據(jù)的讀出和寫入:

    一個(gè)進(jìn)程向管道中寫的內(nèi)容被管道另一端的進(jìn)程讀出。寫入的內(nèi)容每次都添加在管道緩沖區(qū)的末尾,并且每次都是從緩沖區(qū)的頭部讀出數(shù)據(jù)。然而 管道應(yīng)用的一個(gè)重大限制是它沒有名字,因此,只能用于具有親緣關(guān)系的進(jìn)程間通信, 在有名管 道(namedpipe或FIFO)提出后,該限制得到了克服。FIFO不同于管道之處在于它 提供一個(gè)路徑名與之關(guān)聯(lián),以FIFO的文件形式存在于文件系統(tǒng)中。這樣,即使與FIFO的創(chuàng)建進(jìn)程不存在親緣關(guān)系的進(jìn)程,只要可以訪問該路徑,就能夠彼此通過FIFO相互通信(能夠訪問該路徑的進(jìn)程以及FIFO的創(chuàng)建進(jìn)程之間),因此,通過FIFO不相關(guān)的進(jìn)程也能交換數(shù)據(jù)。值得注意的是,F(xiàn)IFO嚴(yán)格遵循先進(jìn)先出(firstin first out),對(duì)管道及FIFO的讀總是從開始處返回?cái)?shù)據(jù),對(duì)它們的寫則把數(shù)據(jù)添加到末尾。它們不支持諸如lseek()等文件定位操作。

 4、 管道的創(chuàng)建

    #include    int pipe(int fd[2])    fd為filedescriptors的縮寫,其為一個(gè)二元數(shù)組,用于存放pipe函數(shù)所創(chuàng)建管道的兩個(gè)    文件描述符,fd[0]存放管道讀取端的文件描述符,fd[1]用于存放管道寫入端的文件描述符。    函數(shù)創(chuàng)建的管道的兩端處于一個(gè)進(jìn)程中間,在實(shí)際應(yīng)用中沒有太大意義,因此,一個(gè)進(jìn)程在由    pipe()創(chuàng)建管道后,一般再fork一個(gè)子進(jìn)程,需要是調(diào)用exec函數(shù)族使子進(jìn)程執(zhí)行所需程序    。然后通過管道實(shí)現(xiàn)父子進(jìn)程間的通信(因此也不難推出,只要兩個(gè)進(jìn)程中存在親緣關(guān)系,這    里的親緣關(guān)系指的是具有共同的祖先,都可以采用管道方式來進(jìn)行通信)。

 5、 有名管道的創(chuàng)建

      #include      #include      int mkfifo(const char * pathname, mode_t mode)      該函數(shù)的第一個(gè)參數(shù)是一個(gè)普通的路徑名,也就是創(chuàng)建后FIFO的名字。第二個(gè)參數(shù)與打開普通文件      的open()函數(shù)中的mode 參數(shù)相同。      如果mkfifo的第一個(gè)參數(shù)是一個(gè)已經(jīng)存在的路徑名時(shí),會(huì)返回EEXIST錯(cuò)誤,所以一般典型的調(diào)用      代碼首先會(huì)檢查是否返回該錯(cuò)誤,如果確實(shí)返回該錯(cuò)誤,那么只要調(diào)用打開FIFO的函數(shù)就可以了。      一般文件的I/O函數(shù)都可以用于FIFO,如close、read、write等等。      認(rèn)清管道和有名管道的讀寫規(guī)則是在程序中應(yīng)用它們的關(guān)鍵,下面就對(duì)管道和有名管道的讀寫規(guī)則      做的一點(diǎn)總結(jié):   

      1、管道的讀寫規(guī)則:

       如果管道的寫端不存在,則認(rèn)為已經(jīng)讀到了數(shù)據(jù)的末尾,讀函數(shù)返回的讀出字節(jié)數(shù)為0;       當(dāng)管道的寫端存在時(shí),如果請(qǐng)求的字節(jié)數(shù)目大于PIPE_BUF,則返回管道中現(xiàn)有的數(shù)據(jù)字節(jié)數(shù),如果       請(qǐng)求的字節(jié)數(shù)目不大于PIPE_BUF,則返回管道中現(xiàn)有數(shù)據(jù)字節(jié)數(shù)。       向管道中寫入數(shù)據(jù)時(shí),linux將不保證寫入的原子性,管道緩沖區(qū)一有空閑區(qū)域,寫進(jìn)程就會(huì)試圖向

       管道寫入數(shù)據(jù)。如果讀進(jìn)程不讀走管道緩沖區(qū)中的數(shù)據(jù),那么寫操作將一直阻塞。

       2、有名管道比管道多了一個(gè)打開操作:open。

       FIFO的打開規(guī)則:       如果當(dāng)前打開操作是為讀而打開FIFO時(shí),若已經(jīng)有相應(yīng)進(jìn)程為寫而打開該FIFO,則當(dāng)前打開       操作將成功返回;否則,可能阻塞直到有相應(yīng)進(jìn)程為寫而打開該FIFO(當(dāng)前打開操作設(shè)置了       阻塞標(biāo)志);或者,成功返回(當(dāng)前打開操作沒有設(shè)置阻塞標(biāo)志)。       如果當(dāng)前打開操作是為寫而打開FIFO時(shí),如果已經(jīng)有相應(yīng)進(jìn)程為讀而打開該FIFO,則當(dāng)前       打開操作將成功返回;否則,可能阻塞直到有相應(yīng)進(jìn)程為讀而打開該FIFO(當(dāng)前打開操作       設(shè)置了阻塞標(biāo)志);或者,返回ENXIO錯(cuò)誤(當(dāng)前打開操作沒有設(shè)置阻塞標(biāo)志)。                  從FIFO中讀取數(shù)據(jù):如果有進(jìn)程寫打開FIFO,且當(dāng)前FIFO內(nèi)沒有數(shù)據(jù),則對(duì)于設(shè)置了阻塞標(biāo)志           的讀操作來說,將一直阻塞。               讀打開的阻塞標(biāo)志只對(duì)本進(jìn)程第一個(gè)讀操作施加作用,如果本進(jìn)程內(nèi)有多個(gè)讀操作序列,則       在第一個(gè)讀操作被喚醒并完成讀操作后,其它將要執(zhí)行的讀操作將不再阻塞,即使在執(zhí)行讀       操作時(shí),F(xiàn)IFO中沒有數(shù)據(jù)也一樣(此時(shí),讀操作返回0)。       如果沒有進(jìn)程寫打開FIFO,則設(shè)置了阻塞標(biāo)志的讀操作會(huì)阻塞。       由于使用有名管道時(shí),需要在兩個(gè)將進(jìn)行通信的進(jìn)程中分別打有名名管道,因此,當(dāng)一個(gè)進(jìn)       程度打開(或?qū)懘蜷_)一個(gè)有名管道而沒有其他進(jìn)程寫打開(或讀打開)此有名管道時(shí),該進(jìn)程           就會(huì)進(jìn)入阻塞狀態(tài),直到另一個(gè)進(jìn)程寫打開(或讀打開)此有名管道。刪除一個(gè)有名管道可  

         以用unlink()。  

6、管道的創(chuàng)建和關(guān)閉代碼

      

7、結(jié)果

8、管道的讀寫代碼

9、結(jié)果


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 湖南省| 波密县| 桦甸市| 大石桥市| 禹州市| 延川县| 盐边县| 泸溪县| 鸡西市| 长宁区| 遂溪县| 商南县| 华池县| 洪湖市| 德保县| 宾阳县| 云梦县| 齐河县| 芜湖县| 台北市| 丰都县| 凤台县| 江门市| 岫岩| 靖安县| 晋城| 彭山县| 友谊县| 扬中市| 建水县| 本溪| 开江县| 紫云| 屏边| 封开县| 朝阳区| 永川市| 临漳县| 延津县| 易门县| 南溪县|