真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

IPC-管道通信

管道(PIPE)

創(chuàng)新互聯(lián)專注于仲巴企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),購(gòu)物商城網(wǎng)站建設(shè)。仲巴網(wǎng)站建設(shè)公司,為仲巴等地區(qū)提供建站服務(wù)。全流程定制開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)


管道是一種最基本的IPC機(jī)制,由pipe函數(shù)在內(nèi)核中開辟一塊緩沖區(qū)(稱為管道)用于通信,所以管道在用戶程序看起來(lái)就像一個(gè)打開的文件,通過(guò)read(filedes[0]);或者write(filedes[1]);

int pipe(int filedes[2]);

參數(shù):filedes參數(shù)傳給用戶程序兩個(gè)文件描述符表。filedes[0]指向管道的讀端,filedes[1]指向管道的
寫端

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

int fseek(FILE *stream, long offset, int fromwhere);

stream:將指向以fromwhere為基準(zhǔn)

offset:偏移offset(指針偏移量)個(gè)字節(jié)的位置

返回值:

    失敗:(比如offset超過(guò)文件自身大小),則不改變stream指向的位置,函數(shù)返回一個(gè)非0值。

    成功:stream將指向fromwhere,偏移量offset個(gè)字節(jié)的位置。

父子進(jìn)程通信的步驟:

1.父進(jìn)程創(chuàng)建管道,開辟管道,得到兩個(gè)文件描述符指向管道的兩端IPC-管道通信
2.父進(jìn)程fork創(chuàng)建出子進(jìn)程,那么子進(jìn)程也有兩個(gè)文件描述符指向同一管道IPC-管道通信
3.父進(jìn)程關(guān)閉fd[0],子進(jìn)程關(guān)閉fd[1]。父進(jìn)程可以往管道里寫,子進(jìn)程可以往管道里讀,管道是環(huán)形隊(duì)列實(shí)現(xiàn)的,數(shù)據(jù)從寫端流入,讀端流出,這就實(shí)現(xiàn)了進(jìn)程間通信。IPC-管道通信

管道內(nèi)部的實(shí)現(xiàn)機(jī)制:

IPC-管道通信

實(shí)際上管道沒有單獨(dú)的實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu) ,他利用文件在Linux中,而是借助文件系統(tǒng)的file結(jié)構(gòu)和VFS文件索引節(jié)點(diǎn)inode,通過(guò)將兩個(gè) file 結(jié)構(gòu)指向同一個(gè)臨時(shí)的VFS 索引節(jié)點(diǎn),而這個(gè) VFS 索引節(jié)點(diǎn)又指向一個(gè)物理頁(yè)面而實(shí)現(xiàn)的。有兩個(gè)file數(shù)據(jù)結(jié)構(gòu),但它們定義文件操作例程地址是不同的,其中一個(gè)是向管道中寫入數(shù)據(jù)的例程地址,而另一個(gè)是從管道中讀出數(shù)據(jù)的例程地址。這樣,用戶程序的系統(tǒng)調(diào)用仍然是通常的文件操作,而內(nèi)核卻利用這種抽象機(jī)制實(shí)現(xiàn)了管道這一特殊操作。

測(cè)試管道容量

測(cè)試原理:讀端不讀,寫端一直寫

#include
#include
#include
#include
#include
#include

int get_pipe_size(FILE* fd)
{
    fseek(fd,0,SEEK_SET);
    int start = ftell(fd);
    fseek(fd,0,SEEK_END);
    int end = ftell(fd);
    return end - start;
}

int main()
{
    int _pipe[2];
    int ret = pipe(_pipe);
    if(ret == -1)
    {
    //    printf("create pipe error ,error code is:%d\n",error);
        return 1;
    }

    pid_t id = fork();
    if(id <0)
    {
        printf("fork error");
        return 2;
    }
    else if(id == 0)  //child 關(guān)閉讀端
    {
        close(_pipe[0]);
        int i =0;
        char* _msg = NULL;

        //the writer keep writing
        while(1)
        {
            _msg = "r";
            write(_pipe[1],_msg,strlen(_msg));  //一直寫
            printf("%d\n",i);
            i++;
        }
        printf("write over...\n");
    }

    else
    {
        //father
        close(_pipe[1]);//關(guān)閉寫端
        char _msg[100];
        int j =0;
        sleep(5);
        int status = 0;
        while(1)
        {
            status = 0;
            memset(_msg,'\0',sizeof(_msg));
            printf("%s:code id:%d\n",_msg,ret);

        }
        if(waitpid(id,&status,0)<0)
        {
            return 3;
        }
        printf("status:%d\n",(status)&0xff);
    }
    return 0;
}

測(cè)試結(jié)果:大約64k

IPC-管道通信



網(wǎng)頁(yè)名稱:IPC-管道通信
轉(zhuǎn)載來(lái)源:http://weahome.cn/article/jpdceh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部