首页 > 后端开发 > C++ > 如何在 Linux 中使用管道 Stdin 和 Stdout 执行子进程?

如何在 Linux 中使用管道 Stdin 和 Stdout 执行子进程?

DDD
发布: 2024-11-19 15:27:03
原创
844 人浏览过

How to Execute Child Processes with Piped Stdin and Stdout in Linux?

在 Linux 中使用管道标准输入和标准输出执行子进程

在 Linux 中,需要使用管道标准输入(stdin)执行子进程的任务)和标准输出(stdout)可以通过各种系统调用或 POSIX 函数来完成。具体来说,对于 Linux 3.0 及更高版本,推荐的方法包括使用 pipeline()、fork()、execve() 和 dup2()。

解决方案概述

  1. 创建管道:

    • 使用 pipeline() 创建两个管道:一个用于 stdin (aStdinPipe),另一个用于 stdout (aStdoutPipe)。
  2. Fork 进程:

    • 使用 fork() 创建子进程。
  3. 子进程中的 IO 重定向:

    • 在子进程中,使用 dup2() 将 stdin 从 aStdinPipe[PIPE_READ] 重定向到子进程的 stdin,以及 stdout/ stderr 到 aStdoutPipe[PIPE_WRITE]。
  4. 关闭未使用的管道:

    • 关闭 aStdinPipe[PIPE_READ 未使用的文件描述符] 和 aStdoutPipe[PIPE_WRITE] 在父进程中。
  5. 子进程:

    • 在子进程执行所需的命令。
  6. IO 通信:

    • 在父进程中,将数据写入到 aStdinPipe [PIPE_WRITE] 为子进程提供输入。
    • 从 aStdoutPipe[PIPE_READ] 读取数据以接收子进程的输出。

实现

以下 C 代码演示了此解决方案:

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
#include <fcntl.h>

using namespace std;

int main() {
  int aStdinPipe[2], aStdoutPipe[2];
  pid_t childPid;
  char buffer[1024];
  const char* command = "foo";
  string input = "Hello World!";

  // Create pipes
  if (pipe(aStdinPipe) == -1 || pipe(aStdoutPipe) == -1) {
    cerr << "Error creating pipes." << endl;
    return EXIT_FAILURE;
  }

  // Fork child process
  childPid = fork();
  if (childPid == -1) {
    cerr << "Error creating child process." << endl;
    return EXIT_FAILURE;
  }

  // Redirect IO in child process
  if (childPid == 0) {
    // Child process
    if (dup2(aStdinPipe[PIPE_READ], STDIN_FILENO) == -1 ||
        dup2(aStdoutPipe[PIPE_WRITE], STDOUT_FILENO) == -1 ||
        dup2(aStdoutPipe[PIPE_WRITE], STDERR_FILENO) == -1) {
      cerr << "Error redirecting IO in child." << endl;
      return EXIT_FAILURE;
    }

    // Close unused pipes
    close(aStdinPipe[PIPE_READ]);
    close(aStdinPipe[PIPE_WRITE]);
    close(aStdoutPipe[PIPE_WRITE]);

    // Execute command
    execve(command, NULL, NULL);
  }

  // Close unused pipes in parent process
  close(aStdinPipe[PIPE_READ]);
  close(aStdoutPipe[PIPE_WRITE]);

  // Write input to child process
  write(aStdinPipe[PIPE_WRITE], input.c_str(), input.length());

  // Read output from child process
  int numBytesRead = 0;
  while ((numBytesRead = read(aStdoutPipe[PIPE_READ], buffer, sizeof(buffer))) > 0) {
    cout.write(buffer, numBytesRead);
  }

  // Close remaining pipes
  close(aStdinPipe[PIPE_WRITE]);
  close(aStdoutPipe[PIPE_READ]);

  return EXIT_SUCCESS;
}
登录后复制

此代码将使用输入字符串 input 执行 foo 命令,并且 foo 的输出将打印到控制台.

以上是如何在 Linux 中使用管道 Stdin 和 Stdout 执行子进程?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板