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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-09 03:52:02709浏览

How to Execute a Child Process with Piped Stdin/Stdout in Linux?

在 Linux 中使用管道 Stdin/Stdout 执行子进程

在 Linux 中,使用 Pipedstdin/stdout 执行子进程需要组合Linux 系统调用或 POSIX 函数。为了实现这一点,我们将利用以下技术:

  1. 管道创建(管道系统调用):创建单向进程间通信通道,允许父进程和子进程之间进行数据交换。
  2. 文件描述符复制(dup2 系统调用): 复制现有文件描述符,用于重定向输入或输出流。
  3. fork 和 exec(fork execve 系统调用): 创建一个执行指定命令的新子进程(在我们的例子中为“foo”) .
  4. 文件描述符管理:关闭未使用的文件描述符以防止错误并确保正确的资源

下面是实现这些技术的 C 示例:

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

using namespace std;

int main() {
  // Input string
  string s = "Hello, world!";

  // Create pipes for stdin and stdout
  int stdinPipe[2], stdoutPipe[2];
  pipe(stdinPipe);
  pipe(stdoutPipe);

  // Fork a child process
  int pid = fork();

  if (pid == 0) {  // Child process
    // Redirect stdin and stdout to pipes
    dup2(stdinPipe[0], STDIN_FILENO);  // Read from pipe
    dup2(stdoutPipe[1], STDOUT_FILENO);  // Write to pipe

    // Close unused file descriptors
    close(stdinPipe[1]);
    close(stdoutPipe[0]);

    // Execute "foo" with piped stdin
    execlp("foo", "foo", NULL);

    // Exit child process on failure
    exit(1);
  } else if (pid > 0) {  // Parent process
    // Close unused file descriptors
    close(stdinPipe[0]);
    close(stdoutPipe[1]);

    // Write to stdin pipe
    write(stdinPipe[1], s.c_str(), s.length());
    close(stdinPipe[1]);

    // Read from stdout pipe
    char buffer[256];
    int bytesRead = 0;
    string output;
    while ((bytesRead = read(stdoutPipe[0], buffer, sizeof(buffer))) > 0) {
      output.append(buffer, bytesRead);
    }
    close(stdoutPipe[0]);

    // Print output string
    cout << output << endl;
  }

  return 0;
}

此代码片段:

  • 使用以下命令为 stdin 和 stdout 创建管道管道。
  • 使用 fork 分叉子进程。
  • 在在子进程中,它使用 dup2 将 stdin 和 stdout 重定向到管道,然后使用 execlp 使用管道 stdin 执行“foo”。
  • 在父进程中,它关闭未使用的文件描述符,写入 stdin 管道,并从中读取用于捕获输出的 stdout 管道。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn