是否可以在Linux中将数据写入自己的stdin

时间:2012-06-20 20:48:45

标签: c++ linux cgi

我想从IDE调试我的cgi脚本(C ++),所以我想创建一个“调试模式”:从磁盘读取文件,将其推送到自己的stdin,设置一些环境变量,对应这个文件并运行Web服务器调用的其余脚本。是否可能,如果是,那我该怎么做?

2 个答案:

答案 0 :(得分:12)

您无法推送自己的stdin",但您可以将文件重定向到您自己的标准输入。

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

答案 1 :(得分:2)

每个人都知道标准输入是一个定义为STDIN_FILENO的文件描述符。虽然它的价值不能保证0,但我从未见过任何其他东西。无论如何,没有什么可以阻止你写入该文件描述符。为了举例,这里有一个小程序,它将10条消息写入自己的标准输入:

#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条消息后输入的内容。然后按 Ctrl + D 表示输入和程序退出结束。