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
No puede "presionar para poseer stdin", pero puede redirigir un archivo a su propia configuración.
freopen("myfile.txt","r",stdin);
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.
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
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"> ;-)) –
- 1. Cómo escribir datos en el proceso STDIN del proceso externo?
- 2. ¿Es posible distribuir STDIN en procesos paralelos?
- 3. Erlang leer stdin escribir stdout
- 4. ¿Es posible escribir extensiones en el depurador de Delphi?
- 5. ¿Es posible escribir un firewall en python?
- 6. Cómo escribir propio dynamic_cast
- 7. ¿Cómo escribir en el stdin de otra aplicación?
- 8. ¿Es posible escribir frases sencillas en Python?
- 9. ¿Es posible usar xcodebuild en Linux?
- 10. ¿Cómo escribir mi propio contenedor en C#?
- 11. ¿Es posible escribir código para escribir código?
- 12. Comprimir archivos mientras lee datos de STDIN
- 13. ¿Es posible escribir aplicaciones de consola en el esquema?
- 14. ¿Es posible escribir el método de intercambio en Java?
- 15. ¿Es posible escribir sintaxis como -()()?
- 16. Posible escribir el código Protovis en CoffeeScript?
- 17. ¿Es posible escribir en la consola en color en .NET?
- 18. ¿Cuál es la diferencia entre STDIN y $ stdin en Ruby?
- 19. ¿es posible escribir un rastreador web en javascript?
- 20. Posible cancelar el apagado en Linux?
- 21. ¿Cómo creo mi propio certificado de comodín en Linux?
- 22. ¿Es posible escribir texto en richtextbox en tiempo de diseño?
- 23. Cómo escribir mi propio Smarty If-case
- 24. ¿Cómo escribir en el portapapeles en Ubuntu/Linux en R?
- 25. ¿Cada proceso tiene su propio stdin, stdout y stderr?
- 26. Cómo cambiar la codificación stdin en python
- 27. ¿Es posible escribir un cliente de Skype?
- 28. ¿Es posible escribir entidades de tipo genérico en VHDL?
- 29. ¿Es posible escribir código de ensamblaje en vb.net o C#?
- 30. ¿Cómo es posible escribir legalmente ::: en C++ y ??? Cª#?
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
Incorrecto. Puedes :) –
bien. 'fungetc' solo funciona para 1 byte. No puede usarse para la entrada cgi como el op intencional. –