2012-06-20 3 views
10

IDEからCgiスクリプト(C++)をデバッグしたいので、「デバッグモード」を作成します:ディスクからファイルを読み込み、このファイルに対応するいくつかの環境変数を設定し、Webサーバーによって呼び出されたときにスクリプトの残りの部分を実行します。それが可能かどうか、それがどうすればいいのですか?Linuxで自分のstdinにデータを書き込むことは可能ですか?

答えて

10

"自分の標準にプッシュ"することはできませんが、自分の標準にファイルをリダイレクトできます。

freopen("myfile.txt","r",stdin); 
+0

さて、stdioを仮定すると、[fungetc](http://pubs.opengroup.org/onlinepubs/7908799/xsh/ungetc.html)があります。しかし、これは1バイト以上のプッシュバックを保証するものではありません。 – ephemient

+1

間違っています。できます:) –

+0

よく。 'fungetc'は1バイトで動作します。 opが意図しているように、cgi入力には使用できません。 –

2

標準入力がSTDIN_FILENOとして定義されたファイル記述子であることは、誰もが知っています。その価値は0であることが保証されていませんが、他に何も見たことがありません。とにかく、そのファイル記述子への書き込みを妨げるものは何もありません。

#include <unistd.h> 
#include <string> 
#include <sstream> 
#include <iostream> 
#include <thread> 

int main() 
{ 
    std::thread mess_with_stdin([]() { 
      for (int i = 0; i < 10; ++i) { 
       std::stringstream msg; 
       msg << "Self-message #" << i 
        << ": Hello! How do you like that!?\n"; 
       auto s = msg.str(); 
       write(STDIN_FILENO, s.c_str(), s.size()); 
       usleep(1000); 
      } 
     }); 

    std::string str; 
    while (getline(std::cin, str)) 
     std::cout << "String: " << str << std::endl; 

    mess_with_stdin.join(); 
} 

保存test.cppに、コンパイルして実行すること::

$ g++ -std=c++0x -Wall -o test ./test.cpp -lpthread 
$ ./test 
Self-message #0: Hello! How do you like that!? 
Self-message #1: Hello! How do you like that!? 
Self-message #2: Hello! How do you like that!? 
Self-message #3: Hello! How do you like that!? 
Self-message #4: Hello! How do you like that!? 
Self-message #5: Hello! How do you like that!? 
Self-message #6: Hello! How do you like that!? 
Self-message #7: Hello! How do you like that!? 
Self-message #8: Hello! How do you like that!? 
Self-message #9: Hello! How do you like that!? 
hello? 
String: hello? 
$ 

「もしもし?」例のために、ここでは、独自の標準入力に10件のメッセージを書き込む小さなプログラムです10のメッセージがすべて送信された後に入力したものです。次に、Ctrl + Dを押して、入力終了とプログラム終了を示します。

+3

ファイルディスクリプタ0,1,2がすべてptyに結びついている端末にいるので、ややこしいことになります。あなたは、プログラム自体が読むことができるものは何も書いていません。このトピックについての説明はhttp://stackoverflow.com/q/1441251を参照してください。 – ephemient

+0

真。あなたがttyから切り離されていれば、あなたの入力fdも閉じることができます。正確な解決策は、文脈に依存していると思います。パイプ/ dup2などを行うことは可能です。もし 'stdin'を再び開くと' std :: cin'などはどうでしょうか?ロボットが常に「もっと入力が必要」と言っていた映画を思い出させます;-)) –

関連する問題