Linux通信之無名管道

1.管道的創建

#include<unistd.h>

int pipe(int fd[2]);

      一個進程在由pipe()創建管道後,一般再fork一個子進程,然後通過管道實現父子進程間的通信。

2.管道的讀寫規則

   管道兩端可分別用描述字fd[0]以及fd[1]來描述,fd[0]描述的是隻讀管道,稱爲管道讀端。fd[1]描述的是隻寫管道,稱爲管道寫端。

3.程序演示

#include
#include
#include
#include
#include

/*
 * 功能:通過無名管道實現文件拷貝
 *argv[0]爲源文件路徑名,argv[1]爲目標路徑名
*/

#define SIZE 1024 //定義緩衝區大小

//錯誤處理函數
void err_exit(char* msg)
{
    printf("%s\n",msg);
    exit(EXIT_FAILURE);
}

int main(int argc,char* argv[])
{
    if(argc != 3)
       err_exit("參數不正確");
     
    int fd[2];//定義管道描述符
    
    if(pipe(fd) == -1)
    {
       perror("pipe()");
       err_exit("分配管道出錯!");
    }
    
    char buf[SIZE];//緩衝區
    ssize_t n;
    
    if(fork() == 0)
    {
       close(fd[0]);//在子進程中關閉讀端
       int fdr = open(argv[1],O_RDONLY);
       while((n = read(fdr,buf,SIZE)) >0)
       {
           write(fd[1],buf,n);
       }
       close(fd[1]);
       close(fdr);
       exit(EXIT_SUCCESS);
    }
    
    
    close(fd[1]);//在父進程中關閉寫端
    int fdw = open(argv[2],O_CREAT | O_WRONLY,0666);
    while((n = read(fd[0],buf,SIZE)) >0)
    {
        write(fdw,buf,n);
    }
    close(fd[0]);
    close(fdw);
    
    return 0;
    
}
    
    
    






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