Linux通信之无名管道

本文介绍如何使用无名管道实现文件从一个进程到另一个进程的拷贝过程。包括管道的创建、读写规则及一个具体的C语言实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    
}
    
    
    






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值