2012-06-20 24 views
10

Quiero depurar mi script cgi (C++) de IDE, así que me gustaría crear un "modo de depuración": leer el archivo del disco, empujarlo a la propia stdin, establezca algunas variables de entorno, que correspondan a este archivo y ejecute el resto del script como lo llamó el servidor web. ¿Es posible y si lo es, entonces cómo puedo hacer eso?¿Es posible escribir datos en el propio stdin en Linux

Respuesta

10

No puede "presionar para poseer stdin", pero puede redirigir un archivo a su propia configuración.

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

Bueno, asumiendo stdio, hay [fungetc] (http://pubs.opengroup.org/onlinepubs/7908799/xsh/ungetc.html). Pero eso no garantiza más de un byte de push-back. – ephemient

+1

Incorrecto. Puedes :) –

+0

bien. 'fungetc' solo funciona para 1 byte. No puede usarse para la entrada cgi como el op intencional. –

2

Todo el mundo sabe que la entrada estándar es un descriptor de archivo definido como STDIN_FILENO. Aunque su valor no está garantizado en 0, nunca vi nada más. De todos modos, no hay nada que le impida escribir en ese descriptor de archivo. Por el bien de ejemplo, aquí es un pequeño programa que escribir 10 mensajes a su propia entrada estándar:

#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(); 
} 

Guardar eso en test.cpp, compilar y ejecutar:

$ 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? 
$ 

El "? Hola" parte es algo que escribí después de que se enviaron los 10 mensajes. A continuación, presione Ctrl + D para indicar el final de la entrada y las salidas del programa.

+3

Parece que funciona un poco porque estás en un terminal donde los descriptores de archivos 0, 1 y 2 están todos vinculados a la pty. No está escribiendo nada que el programa mismo pueda leer. Vea http://stackoverflow.com/q/1441251 para alguna exposición sobre este tema. – ephemient

+0

Es cierto. Si está desconectado del tty, su entrada fd también puede estar cerrada. Supongo que una solución exacta depende del contexto. Es bastante posible hacer pipe/dup2 etc. Y si vuelves a abrir 'stdin', ¿qué tal' std :: cin', etc.? Me recuerda a una película en la que un robot decía constantemente "Necesita más información"> ;-)) –

Cuestiones relacionadas