Linux系统编程之无名管道

本文详细介绍了Linux系统中无名管道的使用方法,包括如何通过int pipe(intpipefd[2])函数创建管道,以及如何在父子进程中进行数据的写入和读取。通过一个具体的示例代码,展示了无名管道在进程间通信中的应用。

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

在linux中,一切文件!

       无名管道也是一种文件,无名管道用于具有血缘关系的进程之间,为半双工模式。我们可以想象一下,一个管道有两端,一个用来写入数据,另一个用来读取数据,无名管道用int pipe(int pipefd[2])函数创建,可用man 2 pipe在Linux中查看函数详情。因此,无名管道在创建成功后,会生成两个文件描述符,一个用来指向读端口,一个指向写端口,这两个文件描述符放在长度为2的数组中,其中第0个元素表示的整数为写文件的描述符,第1个元素的整数位读文件的描述符:

如下是demo函数:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void read_data(int *);
void write_data(int *);

int main(int argc, char *argv[])
{
    int pipes[2];//pipe[0]用于读,pipe[1]用于写
    int rc;
    pid_t pid;
    
    rc = pipe(pipes);
    if(rc == -1)
    {
        perror("\npipes\n");
        exit(1);
    }
    
    pid = fork();
    switch(pid)
    {
        case -1:
            perror("\nfork\n");
            exit(1);
        case 0:   //子进程
        read_data(pipes);
        
        default://父进程
        write_data(pipes);
    }
    
    return 0;
}

void read_data(int pipes[])
{
    int c,rc;
    close(pipes[1]);//关掉写
    while((rc = read(pipes[0], &c ,1)) > 0)
    {
        putchar(c);
    }
    exit(0);
}

void write_data(int pipes[])
{
    int c ,rc;
    close(pipes[0]);//关掉读
    while((c = getchar()) > 0)
    {
        rc = write(pipes[1], &c, 1);
        if(rc == -1)
        {
            perror("\nwrite\n");
            close(pipes[1]);//关掉写
            exit(1);
        }
    }
    
    close(pipes[1]);//关掉写
    exit(0);    
}

这个函数的功能是在父进程中向无名管道写入数据,在子进程中读取出来。

编译该函数,生成名为pipe的文件,运行pipe文件:

实际的效果为,你输入什么字符串,终端就显示什么字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值