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