Funciona en Windows, pero no en linux...

Iniciado por dgg006, 28 Mayo 2011, 16:15 PM

0 Miembros y 1 Visitante están viendo este tema.

dgg006

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:


#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

Oblivi0n

usas system("cls") y ese comando es unico de windows (creo), en linux creo que se puede usar "clear"

saludos

dgg006

Gracias por la pronta respuesta, pero si te fijas, ya lo había aclarado, ese codigo tal como esta funciona en windows

Oblivi0n

Lo siento no habia leido la parte de abajo  :xD

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

dakomt

una corazonada..... añade un salto de linea a los printf... es decir...

printf ("Apagado\n");

printf ("Encendido\n");

dgg006

Cita de: dakomt en 28 Mayo 2011, 17:24 PM
una corazonada..... añade un salto de linea a los printf... es decir...

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!

dakomt

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

dgg006

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?

dakomt

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!

dgg006

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