elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Por que read no funciona con system?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Por que read no funciona con system?  (Leído 2,755 veces)
Lieutenant McFarley

Desconectado Desconectado

Mensajes: 49



Ver Perfil
Por que read no funciona con system?
« 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?


En línea

fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: Por que read no funciona con system?
« Respuesta #1 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



En línea

Un byte a la izquierda.
RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: Por que read no funciona con system?
« Respuesta #2 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.
En línea

Lieutenant McFarley

Desconectado Desconectado

Mensajes: 49



Ver Perfil
Re: Por que read no funciona con system?
« Respuesta #3 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.  
En línea

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: Por que read no funciona con system?
« Respuesta #4 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda funcion "SYSTEM", ¿porque funciona con unos comandos y con otros no?
Programación C/C++
BlerofonT 8 17,154 Último mensaje 10 Julio 2012, 12:09 pm
por HdM
System.Xml.Linq y System.Core « 1 2 »
.NET (C#, VB.NET, ASP)
SγиtαxEяяoя 10 7,129 Último mensaje 23 Junio 2013, 23:50 pm
por Eleкtro
Problema con read/write system calls
Programación C/C++
xaps 5 2,227 Último mensaje 8 Junio 2014, 15:28 pm
por Eternal Idol
Read timeout
Java
Xedrox 2 2,171 Último mensaje 5 Septiembre 2014, 20:45 pm
por Chuidiang
comando read
Scripting
puchi 6 3,531 Último mensaje 28 Diciembre 2016, 20:59 pm
por puchi
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines