Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: dgg006 en 28 Mayo 2011, 16:15 pm



Título: Funciona en Windows, pero no en linux...
Publicado por: dgg006 en 28 Mayo 2011, 16:15 pm
Hola,
Primero que nada me presento.
Mi nombre es Delmo Gonzalez... dgg006 en Internet..
Estoy estudiando informática, y este año tenemos que entregar un proyecto.


Una pequeña parte del proyecto que elegimos, consta de un programa basico, que busque cambios continuamente en un TXT. y haga una accion segun el contenido.
Logré (con esfuerzo, porque no 100% novato en esto) escribir este codigo:

Código:
#include <stdio.h>

int main ()
{
    int resul;
    int estado=-1;
    int infinito=0;

    FILE *texto;
    texto = fopen ("Cocina.txt","r");
    fscanf (texto, "%d",&resul);
    fclose (texto);

    while (infinito == 0)
    {
        switch (resul)
        {
            case 0:
            texto = fopen ("Cocina.txt","r");
            fscanf (texto, "%d",&resul);
            fclose (texto);
            if (estado != 0)
            {
                system("cls");
                printf ("Apagado");
            }
                    estado=0;
                    break;
            case 1:
            texto = fopen ("Cocina.txt","r");
            fscanf (texto, "%d",&resul);
            fclose (texto);
            if (estado != 1)
            {
                system("cls");
                printf ("Encendido");
            }
                    estado=1;
                    break;
        }
    }
}

En windows, funciona perfecto, pero la idea es hacerlo correr en linux server. Cuando lo compilo ahí, compila sin errores, pero NO HACE NADA!!
Queda en negro.
En que estoy fallando? Algo falta para que funcione en linux?
(los system("cls"), hay que cambiarlos por system("clear") para que funcione en linux)
Les comento lo que tiene que hacer este programa.
Lee dentro del TXT.
Si hay un 1, muestra Encendido.
Si hay un 0, muestra Apagado.
Todo dentro de un bucle infinito!!!

A futuro, en lugar de mostrar encendido o apagado, tiene que activar o desactivar un relay en el puerto paralelo, pero supongo que esos códigos irán luego dentro de este. Por algo se empieza.
Gracias y espero sus respuestas


Título: Re: Funciona en Windows, pero no en linux...
Publicado por: Oblivi0n en 28 Mayo 2011, 16:48 pm
usas
Código:
system("cls")
y ese comando es unico de windows (creo), en linux creo que se puede usar "clear"

saludos


Título: Re: Funciona en Windows, pero no en linux...
Publicado por: dgg006 en 28 Mayo 2011, 16:49 pm
Gracias por la pronta respuesta, pero si te fijas, ya lo había aclarado, ese codigo tal como esta funciona en windows


Título: Re: Funciona en Windows, pero no en linux...
Publicado por: Oblivi0n en 28 Mayo 2011, 17:03 pm
Lo siento no habia leido la parte de abajo  :xD

si te compila sin errores entonces ya no tengo ni idea  :-\


Título: Re: Funciona en Windows, pero no en linux...
Publicado por: dakomt en 28 Mayo 2011, 17:24 pm
una corazonada..... añade un salto de linea a los printf... es decir...

Código:
printf ("Apagado\n");

printf ("Encendido\n");


Título: Re: Funciona en Windows, pero no en linux...
Publicado por: dgg006 en 28 Mayo 2011, 18:02 pm
una corazonada..... añade un salto de linea a los printf... es decir...

Código:
printf ("Apagado\n");

printf ("Encendido\n");
LITERALMENTE!!!
Me la quiero cortar!!
Podes creer que era eso!! WTF
No lo vi necesario, para que una nueva linea si antes borro la pantalla.
Un millón de gracias!!

Ahora solo me falta incluirle a este código los comandos para controlar el paralelo.
Ya me verán preguntando por ak :P
Otra ves gracias!


Título: Re: Funciona en Windows, pero no en linux...
Publicado por: dakomt en 28 Mayo 2011, 18:26 pm
me alegro  :xD

Suerte con el proyecto!


PD: Un consejo! Si vas a tener una parte monitorizando constantemente el fichero (lectura) y vas a tener alguna otra que escriba en el fichero,tal vez deberias considerar la posibilidad de tratarlo como un recurso compartido y controlar el acceso al mismo mediante cerrojos. Pero bueno ya dependera exactamente de como tengas planteado el sistema... simplemente te lo comento por si acaso  :D


Título: Re: Funciona en Windows, pero no en linux...
Publicado por: dgg006 en 28 Mayo 2011, 18:29 pm
Me interesa TOTALMENTE lo que me decís.
He tenido errores en ocasiones.

Quien escribe ese TXT en una pagina en PHP, y claro, si tenes la mala suerte de clickear en el momento de la lectura del programa en C, me tira un error.
Podes explicarme como lo soluciono?


Título: Re: Funciona en Windows, pero no en linux...
Publicado por: dakomt en 29 Mayo 2011, 17:13 pm
Mmmm seguramente habra muchas formas de solucionar eso... unas mas elegantes que otras...

Si la página PHP y el programa en C residen en la misma máquina tal vez podrías usar la creación de un archivo temporal y la comprobación de que éste ya exista para implementar un cerrojo... es decir:

1. Mientras exista el fichero 'cerrojo.tmp'--> me quedo esperando
2. (ya no existe el fichero 'cerrojo.tmp' --> lo creo
2.1 si no he podido crearlo vuelvo a 1 para comprobar si el otro programa lo ha creado antes que yo
3. realizo el acceso al fichero Cocina.txt (el programa PHP para escribir , en el caso del C para leer)
4. Elimino el fichero 'cerrojo.tmp'

El codigo de ambos programas seria algo parecido a los puntos anteriores.

No obstante no creo que sea muy eficiente/elegante esta solución... Otra posibilidad tal vez... es convertir el programa en C en un cgi-bin que seria invocado por la pagina PHP cuando hubiera un cambio de estado y de esta forma no seria necesario estar continuamente monitorizando el estado del  fichero Cocina.txt. Pero nuevamente es solo una idea más.. tampoco se como tienes planteado la globalidad del sistema.

Saludos!


Título: Re: Funciona en Windows, pero no en linux...
Publicado por: dgg006 en 31 Mayo 2011, 15:52 pm
Lo que se me habia ocurrido, pero no he tenido tiempo de ponerme a pensar como hacerlo, es desde el PHP.
Osea,
1) Trato de escribir en Cocina.txt
2) Si NO puedo escribir en Cocina.txt (porque esta ocupado)
3) Reintento

Si eso esta dentro d un bucle, no tendria porque mostrar error, y en algún momento lo va a lograr.... Tengo que ver como se hace..

Ya que estamos, quería hacer otra pregunta,
En el paralelo, va a haber 3 o 4 cosas conectadas, como hago para "activar" de a una individualmente???
Todavía no he buscado demasiado del tema, pero por lo que he visto, mandan la orden en binario a todos los puertos.
Ejemplo:
Cocina: "Encendida"
Habitación: "Apagada"
Baño: "Encendido"

Si con este programa solo quiero prender o apagar la Cocina, como hago para que los demás queden como están?
Espero haberme explicado :S


Título: Re: Funciona en Windows, pero no en linux...
Publicado por: dakomt en 2 Junio 2011, 17:37 pm
Bueno... si solo tienes un programa que escribe y otro que lee... y los valores son siempre 0 o 1 es posible que aqui no se den condiciones de carrera y no tengas que liarte con cerrojos y demás. Prueba tal como comentas y a ver si te funciona :-D

A lo segundo me temo que ya no puedo ayudarte xD no estoy puesto en la domótica jaja pero vamos en google seguro que hay mucha informacion y ejemplos al respecto. Investiga!  ;D