91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

IPC-管道通信

發布時間:2020-07-08 17:55:45 來源:網絡 閱讀:497 作者:LHSTS 欄目:編程語言

管道(PIPE)


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

int pipe(int filedes[2]);

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

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

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

stream:將指向以fromwhere為基準

offset:偏移offset(指針偏移量)個字節的位置

返回值

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

    成功:stream將指向fromwhere,偏移量offset個字節的位置。

父子進程通信的步驟:

1.父進程創建管道,開辟管道,得到兩個文件描述符指向管道的兩端IPC-管道通信
2.父進程fork創建出子進程,那么子進程也有兩個文件描述符指向同一管道IPC-管道通信
3.父進程關閉fd[0],子進程關閉fd[1]。父進程可以往管道里寫,子進程可以往管道里讀,管道是環形隊列實現的,數據從寫端流入,讀端流出,這就實現了進程間通信。IPC-管道通信

管道內部的實現機制:

IPC-管道通信

實際上管道沒有單獨的實現數據結構 ,他利用文件在Linux中,而是借助文件系統的file結構和VFS文件索引節點inode,通過將兩個 file 結構指向同一個臨時的VFS 索引節點,而這個 VFS 索引節點又指向一個物理頁面而實現的。有兩個file數據結構,但它們定義文件操作例程地址是不同的,其中一個是向管道中寫入數據的例程地址,而另一個是從管道中讀出數據的例程地址。這樣,用戶程序的系統調用仍然是通常的文件操作,而內核卻利用這種抽象機制實現了管道這一特殊操作。

測試管道容量

測試原理:讀端不讀,寫端一直寫

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<error.h>
#include<string.h>
#include<sys/wait.h>

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 關閉讀端
    {
        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]);//關閉寫端
        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;
}

測試結果:大約64k

IPC-管道通信



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大庆市| 莒南县| 乐山市| 荔浦县| 昌平区| 五河县| 营口市| 出国| 鹤庆县| 怀集县| 南丹县| 宜丰县| 临西县| 勐海县| 乌拉特前旗| 太原市| 康定县| 阿巴嘎旗| 法库县| 武宁县| 楚雄市| 读书| 嘉荫县| 浦城县| 梁平县| 蓬安县| 岳阳市| 江油市| 株洲市| 正阳县| 玉林市| 闽侯县| 霍山县| 循化| 清远市| 慈利县| 敖汉旗| 肇州县| 宜君县| 钦州市| 策勒县|