linux中创建匿名管道时pipefd[2]数组的值

问题:

  在创建匿名管道实现父子进程的通信时,需要创建匿名管道代码如下:

    // 在fork之前创建管道

    int pipefd[2];

    int ret = pipe(pipefd);

…………

int len = read(pipefd[0], buf, sizeof(buf));//数组下标0处的文件描述符存有写入的文件。

后续需要读的时候就直接去0处的文件描述符读取了,我想看看这个pipe函数干了啥,数组里的值到底时多少。

代码:

#include <unistd.h>

#include <sys/types.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main() {

  int pipefd[2];

  printf("%d %d\n",pipefd[0],pipefd[1]);//没调用pipe函数的时候看一下

  int ret=pipe(pipefd);

  printf("%d %d",pipefd[0],pipefd[1]);//调用了以后看一下

  return 0;

}

结果:

多次实验发现结果一直都是3 4。说明建立了管道以后是往文件描述符为3的文件读数据,往文件描述符为4的文件写数据。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果在C++使用管道来获取命令行输出,并且输出结果包含了特殊的字符或颜色控制代码,那么在将输出显示到终端可能会出现乱码。 乱码的原因是终端无法正确解析和显示特殊字符或颜色控制代码。这些特殊字符和控制代码通常用于在终端添加颜色、样式或其他特殊效果。 要解决乱码问题,可以使用`std::cout`输出流,并在输出禁用终端颜色控制代码的解析。可以使用以下方法之一: 1. 使用`std::cout`输出流,并在输出过滤掉控制代码。下面是一个简单的示例代码: ```cpp #include <iostream> #include <unistd.h> #include <sys/wait.h> #include <regex> int main() { int pipefd[2]; pipe(pipefd); pid_t pid = fork(); if (pid == 0) { close(pipefd[0]); dup2(pipefd[1], STDOUT_FILENO); execlp("your_command", "your_command", nullptr); std::cerr << "Failed to execute command" << std::endl; exit(1); } else { close(pipefd[1]); char buffer[4096]; ssize_t bytesRead; while ((bytesRead = read(pipefd[0], buffer, sizeof(buffer))) > 0) { // 过滤掉控制代码 std::string output(buffer, bytesRead); std::regex controlCodeRegex("\033\\[[0-9;]+m"); std::cout << std::regex_replace(output, controlCodeRegex, ""); } int status; waitpid(pid, &status, 0); } return 0; } ``` 在上面的代码,使用`std::regex`过滤掉了控制代码,并将过滤后的输出打印到终端。 2. 使用第三方库,如`pstreams`,来处理命令行输出。`pstreams`库提供了更高级的管道操作,包括对特殊字符和颜色控制代码的处理。使用该库可以更方便地获取并处理命令行输出。你可以在https://github.com/p-ranav/pstreams 找到该库的源代码和使用示例。 无论你选择哪种方法,都可以解决输出乱码的问题,并正确显示命令行输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值