管道設計要求:(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的第一個參數)