Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Lieutenant McFarley en 23 Marzo 2022, 18:53 pm



Título: Por que read no funciona con system?
Publicado por: Lieutenant McFarley en 23 Marzo 2022, 18:53 pm
Linux - Ubuntu. Desde consola
Código:
$read
funciona normal.

En C
Código:
system ("read");
no funciona porque?

Si compila sin dar error pero el ejecutable no funciona bien. La compilacion es la básica:
Código:
gcc -o ejecutable fuente.c
Hay que compilar con otra opcion?


Título: Re: Por que read no funciona con system?
Publicado por: fary en 23 Marzo 2022, 19:34 pm
No tiene nada que ver con la compilación, más bien es por esto...

https://unix.stackexchange.com/questions/581409/error-sh-1-read-arg-count



Título: Re: Por que read no funciona con system?
Publicado por: RayR en 23 Marzo 2022, 19:42 pm
No es recomendable usar la función system. Además de ineficiente, trae muchas complicaciones. En tu caso, como ya te dijeron, es por la variable de entorno. Podrías pasarla explícitamente: system("read REPLY");

Pero de cualquier forma esto no arregla el problema de fondo. Lo que pasa es que system crea al menos un nuevo proceso (de hecho, 2: uno para el shell y otro para el comando), con sus propias variables de entorno, y demás. Aunque se ejecuten dentro de la misma ventana del programa principal, son procesos independientes, y no es nada fácil la intercomunicación, pues se ejecutan de forma secuencial, y cuando system regresa, los procesos hijos ya se han destruido. Quizás en tu programa esto es aceptable, pero en la enorme mayoría de los casos, system es la solución incorrecta.


Título: Re: Por que read no funciona con system?
Publicado por: Lieutenant McFarley en 24 Marzo 2022, 09:44 am
Comprendido, read requiere una variable. Lo que se buscaba es las distintas maneras posibles de captar una tecla en programa C sin tener que teclear Enter. Visto varias que tengo que investigar, usando ncurses, o cosas como ésta: https://www.iteramos.com/pregunta/77064/como-evitar-pulsar-enter-con-getchar-para-leer-un-solo-caracter
pero al ver el read del S.O. y no haber visto nada de eso por Google pense si seria posible.

Al final si que he encontrado una forma que parece funciona. Primero creo un script en bash que use read para leer una variable y guardarla en un fichero y luego en C un programa que ejecuta e script con system y luego abre el fichero y lee el caracter. Y funciona en Ubunto, el script lee el carácter sin tener que pulsar Enter.

Ya se los incovenientes de system, como ya he dicho es curiosidad por ver de cuantas formas se puede leer una tecla sin Enter.

Dejo aqui como lo he hecho yo.
El script de nombre captar_tecla_0.sh:

Código:
#!/bin/bash
read -n1 variable
echo $variable > tecla.txt
exit

Y el programa en C:

Código
  1. // intenta captar tecla usando system con un script .sh
  2. #include <stdio.h>
  3.  
  4. int main ()
  5. {
  6. FILE *fichero_con_tecla;
  7. char tecla;
  8.  
  9. system ("./captar_tecla_0.sh");
  10. if ( (fichero_con_tecla = fopen ("tecla.txt", "r")) == NULL)
  11. {
  12. printf ("\nError en apertura de fichero\n");
  13. return 0;
  14. }
  15. tecla = fgetc (fichero_con_tecla);
  16. fclose (fichero_con_tecla);
  17. printf ("\nLa tecla es: %c\n", tecla);
  18. return 0;
  19. }
  20.  


Título: Re: Por que read no funciona con system?
Publicado por: RayR en 24 Marzo 2022, 23:45 pm
Pues la manera en que lo hacen en el link que pusiste (poniendo la terminal en modo no canónico mediante tcsetattr) es la común para Linux. Podrías añadir algo como:

Código
  1. term_nueva.c_lflag &=  ~(ECHO);

si no quieres que se muestre el caracter tecleado. Por lo demás, es una opción muy válida.