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

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

Mary-Kate Olsen
發布: 2024-11-09 03:52:02
原創
716 人瀏覽過

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

在Linux 中使用管道Stdin/Stdout 執行子程序

在Linux 中,使用Pipedstdin/stdout 執行子系統需要組合Lininux呼叫或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中文網其他相關文章!

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