首页 > 其他分享 >c语言中的管道函数

c语言中的管道函数

时间:2024-08-28 11:17:33浏览次数:8  
标签:函数 int pipefd pipe buffer 管道 语言

在 C 语言中,管道是一种用于进程间通信的机制,它允许一个进程与另一个进程之间传递数据。以下是与管道相关的主要函数及其用法,包括 pipepopenpclosedup2 函数。

1. pipe 函数

pipe 函数用于创建一个无名管道。无名管道是单向的,可以在父子进程之间传递数据。

函数原型
    int pipe(int pipefd[2]);
参数说明
    pipefd:一个包含两个整数的数组。pipefd[0] 是管道的读取端,pipefd[1] 是管道的写入端。
返回值
    成功时返回 0,失败时返回 -1,并设置 errno。

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

int main() {
    int pipefd[2];
    char buffer[128];

    // 创建管道
    if (pipe(pipefd) == -1) {
        perror("pipe");
        return 1;
    }

    // 向管道写入数据
    write(pipefd[1], "Hello, world!\n", 14);

    // 从管道读取数据
    read(pipefd[0], buffer, sizeof(buffer));
    printf("Read from pipe: %s", buffer);

    // 关闭管道
    close(pipefd[0]);
    close(pipefd[1]);

    return 0;
}

2. popen 和 pclose 函数

popenpclose 函数用于打开一个管道,执行一个命令,并捕获命令的输出或为命令提供输入。

popen 函数原型
    FILE *popen(const char *command, const char *type);
参数说明
    command:要执行的命令。
    type:指定管道的操作模式,"r" 用于读取命令输出,"w" 用于向命令写入数据。

pclose 函数原型
    int pclose(FILE *stream);

示例代码:

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

int main() {
    char buffer[128];
    FILE *pipe = popen("ls -l", "r");
    if (!pipe) {
        perror("popen");
        return 1;
    }

    // 读取命令的输出
    while (fgets(buffer, sizeof(buffer), pipe) != NULL) {
        printf("%s", buffer);
    }

    // 关闭管道
    int ret = pclose(pipe);
    if (ret == -1) {
        perror("pclose");
        return 1;
    }

    printf("Command exited with status %d\n", WEXITSTATUS(ret));
    return 0;
}

3. dup2 函数

dup2 函数用于将一个文件描述符复制到另一个文件描述符上,可以重定向标准输入或标准输出。

函数原型
    int dup2(int oldfd, int newfd);
参数说明
    oldfd:要复制的文件描述符。
    newfd:要将 oldfd 复制到的文件描述符。

示例

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

int main() {
    int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    // 将标准输出重定向到文件
    dup2(fd, STDOUT_FILENO);

    // 此时 printf 的输出将被写入到 output.txt 中
    printf("This text is written to output.txt\n");

    close(fd);
    return 0;
}

4. pipe 和 fork 结合使用

pipe 和 fork 函数可以结合使用来创建父子进程之间的通信。例如,父进程可以向管道写入数据,而子进程可以从管道读取数据。

示例

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

int main() {
    int pipefd[2];
    char buffer[128];
    pid_t pid;

    if (pipe(pipefd) == -1) {
        perror("pipe");
        return 1;
    }

    pid = fork();
    if (pid == -1) {
        perror("fork");
        return 1;
    }

    if (pid == 0) {  // 子进程
        close(pipefd[1]);  // 关闭写端
        read(pipefd[0], buffer, sizeof(buffer));
        printf("Child read: %s", buffer);
        close(pipefd[0]);
    } else {  // 父进程
        close(pipefd[0]);  // 关闭读端
        write(pipefd[1], "Hello from parent!\n", 19);
        close(pipefd[1]);
    }

    return 0;
}

总结

这些函数提供了在 C 语言中进行进程间通信的强大工具,尤其是对于需要父子进程协同工作的应用场景。这些函数在实际开发中非常有用,例如处理数据流、执行系统命令并捕获输出等。

标签:函数,int,pipefd,pipe,buffer,管道,语言
From: https://www.cnblogs.com/wingfeng/p/18384219

相关文章

  • urb中几个函数的使用
    usb_buffer_alloc(free)说是为了更好的从名字看出这个函数真实做的事情:DMAcoherencylinux提供两种方式,来保证使用dma时,内存和硬件cache的一致性:usb_buffer_alloc()isrenamedtousb_alloc_coherent()  usb_buffer_free()  isrenamedtousb_free_coherent()usb_alloc(......
  • Hive用户定义函数 [单列函数UDF | 聚合函数UDAF]
    Hive中函数有4类:单行函数、聚合函数、炸裂函数、窗口函数用户定义函数(UDF:User-DefinedFunctions)按输入行数与输出行数的对应关系:UDF:普通函数,一进一出UDAF:聚合函数,多进一出UDTF:表生成函数,一进多出,如输入一行array类型,返回3行string类型一、单列函数(UDF-一进一出)1、字符串......
  • C语言实现三子棋小游戏
    前言与概述本文章讲述如何通过C语言开发一款三子棋的小游戏。笔者才识浅薄,如有错误,欢迎各位编程大佬在评论区批评指正,笔者不胜感激。游戏介绍三子棋是一款益智的趣味小游戏。多名玩家在3*3的棋盘下棋,棋盘共九个方格,每个方格最多只能放置一枚棋子。只要有一名玩家下的三个棋......
  • 指针(三):函数指针
    目录函数指针函数的地址函数指针结构函数指针数组了解函数指针数组函数指针数组结构简易计算器函数指针数组优化计算器函数指针函数的地址函数指针,也就是存放函数地址的变量,有人会问,函数也会有地址吗?我们用一个代码来验证一下吧。#include<stdio.h>voidtest(......
  • FlexAttention:解决二次复杂度问题,将大型视觉语言模型的输入提升至1008 | ECCV 2024
    \({\ttFlexAttention}\)是一种旨在增强大型视觉语言模型的方法,通过利用动态高分辨率特征选择和分层自注意机制,使其能够有效地处理并从高分辨率图像输入中获得优势,\({\ttFlexAttention}\)在性能和效率方面超越了现有的高分辨率方法。来源:晓飞的算法工程笔记公众号论文:F......
  • C:回调函数的介绍-学习笔记
    前言:本篇文章我们将继续指针相关知识:回调函数希望大家在看完后能够有所收获!回调函数 定义与概念回调函数是一个通过指针调用的函数。如果把函数指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数,回调函数不是有该函数的实现方......
  • 数据结构链表(C语言版)
    链表定义链表是一种常见的基础数据结构,它由一系列节点(Node)组成,每个节点包含数据域和指向列表中下一个节点的指针(在双向链表中还会有指向前一个节点的指针)。链表的一个优点是它允许有效地在序列中插入和删除元素。节点(Node)一个节点通常包含两个部分:数据域(DataField):存储实......
  • 使用zig语言制作简单博客网站(五)编写博客首页数据请求响应代码
    首页博客列表前端请求代码Zepto(function($){//获取首页文章列表$.ajax({url:'http://localhost:5588/api/home/articles',type:'GET',dataType:......
  • 多语言界面的无限可能:Scratch的国际化之旅
    多语言界面的无限可能:Scratch的国际化之旅Scratch,这款专为儿童和青少年设计的编程工具,在全球范围内受到广泛欢迎。为了满足不同国家和地区用户的需求,Scratch支持多语言界面,使用户无论使用何种语言都能轻松学习编程。本文将详细介绍Scratch如何实现多语言界面,以及如何通过代......
  • 构建高效NLP管道:PydanticOutputParser与Langchain的结合
    PydanticOutputParser是一个用于解析语言模型输出的实用工具,它允许用户指定一个Pydantic模型,并查询语言模型以生成符合该模型的JSON输出。这个工具特别有用,因为它可以帮助开发者确保从语言模型获得的结构化数据符合预期的格式,从而简化了数据处理和集成的过程。使用Pyda......