Linux之管道通信及代碼

管道設計要求:(1)半雙工(數據只能在一個方向上流動)

                        (2)只能在具有公共祖先的兩個進程之間使用

管道實質:實質是內核緩衝區(4kb),內核使用環形隊列機制

函數原型:int pipe(int pipefd[2]); //創建管道

其中,fd返回兩個文件描述符:fd[0]爲讀而打開,fd[1]爲寫而打開,對於兩個進程的通信,在讀/寫入管道時,一個進程需要使用一個fd並關閉另一個fd(確保數據單方向流動)

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
        int fd[2];
        int n;
        pid_t pid;
        char buf[100];

        if(pipe(fd)<0)                //創建管道
                perror("pipe error");
        pid=fork();                   //創建子進程
        if(pid<0) perror("pipe error");
        else if(pid>0) {              //父進程
                close(fd[0]);         //關閉讀
                write(fd[1],"hello world\n",strlen("hello world\n"));  //將內容寫入管道中
        }
        else
        {

                close(fd[1]);         //關閉寫
                n=read(fd[0],buf,sizeof(buf));     //從管道中讀出
                if(n==0) printf("xxxxxxxxxxxxxxxx/n");  //若管道沒內容,則輸出xxxx
                write(STDOUT_FILENO,buf,n);        //將讀出的內容寫到輸出設備上
        }
        exit(0);
}

對於read和write,如何確認第一個參數寫什麼,第二個參數寫什麼:

read、write函數中的第一個參數爲該函數想要實現的內容(如read想把緩衝區的數據讀出來,那麼讀出來放置的位置爲read的第一個參數;write想把文件的內容寫入緩衝區,則緩衝區爲write的第一個參數)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章