簡體   English   中英

如何實現stdin,stdout包裝器?

[英]How to implement a stdin, stdout wrapper?

我有一個運行stdin和stdout的交互式程序。 我需要創建將X發送到它的stdin的包裝器,檢查它是否打印Y然后將包裝器的stdin和stdout重定向到程序的stdin和stdout,就像程序將直接執行一樣。

怎么實現這個? X和Y可以硬編碼。 擊? 蟒蛇?

編輯:我無法運行程序兩次。 它必須是一個例子。 這是偽代碼:

def wrap(cmd, in, expected_out):
  p = exec(cmd)
  p.writeToStdin(in)
  out = p.readBytes (expected_out.size())
  if (out != expected_out) return fail;
  # if the above 4 lines would be absent or (in == "" and out == "")
  # then this wrapper would be exactly like direct execution of cmd
  connectpipe (p.stdout, stdout)
  connectpipe (stdin, p.stdin)
  p.continueExecution() 

期望是為了自動運行其他程序 - 基本上你用純文本寫的東西,

啟動這個程序。 當它打印出“用戶名”這個詞時,請將其用戶名發送給我。 當它發送“密碼”時,請將密碼發送給我。

它非常適合駕駛其他程序。

假設X和Y是文件,並且您可以多次調用該程序:

#!/bin/bash

test "`program <X`" = "`cat Y`" && program

或者,更加冗長地失敗:

#!/bin/bash

if [[ `program <X` != `cat Y` ]]; then
    echo -e "Assertion that input X produces Y failed, exiting."
    exit 1
fi

program

如果您只調用一次程序,則Expect是一種比動態重新分配標准文件I / O更簡單的替代方法。

您可以覆蓋sys模塊的stdin和stdout

import sys
sys.stdin, sys.stdout = wrapper.stdin, wrapper.stdout

這些需要分別是為讀寫而打開的文件對象。 最初的stdin和stdout在

sys.stdin, sys.stdout = sys.__stdin__, sys.__stdout__

我對你究竟想要達到的目標感到有些困惑; 據我所知,你希望:

  1. 啟動包裝器程序,指定輸入X和預期輸出Y.
  2. 讓包裝器啟動目標程序,將輸入X附加到它的stdin,並驗證它的輸出是否與Y匹配。
  3. 讓目標程序返回,並在驗證輸出后,從包裝器程序的同一實例重新運行它,這次使用包裝器程序stdin和stdout。

如果是這種情況,你想這樣做:

  1. 讓包裝器程序打開目標程序的stdin和stdout的管道。
  2. 叉,並關閉所述管道的適當的末端。
  3. 擁有父進程並驗證輸出,而子進程exec()並執行目標程序。
  4. 等待子進程在stdout關閉時終止。
  5. 將包裝程序exec()放入目標程序中。
  6. 現在目標程序將正常執行。

如果這是正確的,我可以提供一個~30行C程序,或~10行Python程序,實現這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM