Возможно ли записать данные в собственный stdin в Linux?

Я хочу отлаживать свой cgi script (С++) из IDE, поэтому я хотел бы создать "режим отладки": прочитать файл с диска, нажать его на собственный stdin, установить некоторые переменные среды, соответствующие этому файлу и запустите оставшуюся часть script, как это было вызвано веб-сервером. Возможно ли, и если да, то как я могу это сделать?

Ответ 1

Вы не можете "нажать на собственный stdin", но вы можете перенаправить файл на свой собственный stdin.

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

Ответ 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, чтобы указать конец ввода и выходы программы.