首頁 > 後端開發 > C++ > 如何在 Linux 中使用管道 Stdin 和 Stdout 執行子程序?

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

DDD
發布: 2024-11-19 15:27:03
原創
833 人瀏覽過

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. 建立管道:

    • 建立管道:
    • 叉子進程:
    使用fork()建立子程序。
    • 子進程中的IO重定向:
  2. 在子進程中,使用dup2() 進行重定向stdin 從aStdinPipe[PIPE_READ] 到子級的stdin,以及stdout/stderr 到aStdoutPipe[PIPE_WRITE]。
    • 關閉未使用的管道:
  3. 關閉未使用的檔案描述符父進程中的aStdinPipe[PIPE_READPipe[PIPE_READPipe ] 和aStdoutPipe[PIPE_WRITE]。
    • 子執行:
  4. 使用 execve () 在子程序中執行所需的指令。
    • IO 通訊:
    • 在父進程中,將資料寫入aStdinPipe[PIPE_WRITE] 以提供輸入到WRITE子進程。
  5. 從中讀取資料aStdoutPipe[PIPE_READ] 接收子程序的輸出。

實作

#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;
}
登入後複製

以下C 程式碼示範了此解決方案:

此程式碼將使用此程式碼輸入字串執行foo 指令輸入,foo 的輸出將會印到控制台。

以上是如何在 Linux 中使用管道 Stdin 和 Stdout 執行子程序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板