Foro de elhacker.net

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



Título: Tareas programadas en C ¿Como?
Publicado por: dgg006 en 15 Junio 2011, 16:44 pm
Hola. Otra ves molestando por acá...

Lo que ahora necesito, puede ser algo útil para muchos, no se como explicarlo bien, así que les cuento lo que debería hacer...

"Es un programa en C, para planificar tareas por horario.
Tendría que leer en un TXT, un hora X (ej:15:22)
Cuando la hora del sistema, sea igual que esa hora X, debe escribir un valor en otro TXT y dejar en blanco el TXT anterior"

Para orientarlos a lo que va dedicado este código, les cuento:
Estoy diseñando un sistema domotico, que a través de internet controla unos relay conectados al paralelo.
La pagina (en PHP) crea un TXT con un 0 o un 1
Un programa en C, lee ese txt, y dependiendo si es un 0 o un 1, apaga o enciende el relay.
Todo eso ya esta echo y funcionando, pero quiero agregarle un estilo de planificación, entonces a la hora elegida, se escribe un 0 o un 1 en el TXT.

Espero su ayuda


Título: Re: Tareas programadas en C ¿Como?
Publicado por: Died en 15 Junio 2011, 17:00 pm
No he leído a fondo, pero para programar tareas sencillamente coge la hora en el formato que necesites y compárala con lo que quieres.
Un saludo. Sagrini


Título: Re: Tareas programadas en C ¿Como?
Publicado por: dgg006 en 15 Junio 2011, 17:49 pm
El tema es ¿como?


Título: Re: Tareas programadas en C ¿Como?
Publicado por: ksiksi en 15 Junio 2011, 18:17 pm
No sé si entendi bien, pero la idea seria hacer un createprocess con un bucle para mantenerlo vivo y usar localtime para averiguar la hora: http://c.conclase.net/librerias/?ansifun=localtime#inicio (http://c.conclase.net/librerias/?ansifun=localtime#inicio)
Eso si estas en windows, pq createprocess es una api de windows.
Sin embargo, sospecho que debe haber una forma mas facil de hacerlo.


Título: Re: Tareas programadas en C ¿Como?
Publicado por: dgg006 en 15 Junio 2011, 18:25 pm
Creo que no lo aclare...
Es bajo Linux.. (Ubuntu Server)


Título: Re: Tareas programadas en C ¿Como?
Publicado por: Died en 15 Junio 2011, 19:37 pm
Código
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4.  
  5. char buffer [40];
  6.  
  7. char *times ()
  8. {
  9. time_t now = time (0);
  10. struct tm *ahora;
  11. ahora=localtime ((const time_t*)&now);
  12. strftime (buffer, 40, "%d/%m/%Y", ahora);
  13. return (char *) buffer;
  14. }
  15.  
  16. int main ()
  17. {
  18. if (strcmp (times (), "15/06/2011") == 0) printf ("1");
  19. else printf ("0");
  20.  
  21. return 0;
  22. }
  23.  
Código:
$ gcc -o code code.c
$ ./code
1
$

La próxima vez mira algo en Google :)
Un saludo. Sagrini


Título: Re: Tareas programadas en C ¿Como?
Publicado por: dgg006 en 16 Junio 2011, 02:41 am
Lo voy a probar y les cuento..
Igual te cuento que busque, pero google te ayuda cuando sabes que buscas, y yo no estoy seguro de que es


Título: Re: Tareas programadas en C ¿Como?
Publicado por: dakomt en 17 Junio 2011, 05:17 am
jeje recuerdo tu proyecto.. me alegro de que hayas progresado  :D

El problema de hacerlo de esa forma es que desde el programa en C deberás estar todo el rato comprobando la hora en un bucle... A menos que te compliques la vida usando algun manejador de señales o algo similar (ejemplo--> http://linux.die.net/man/3/sem_wait (http://linux.die.net/man/3/sem_wait) ) tu programa se volverá muy ineficiente.

Mi consejo..., ya que vas a usar un sistema Linux, es que te ayudes de los comandos del sistema, por ejemplo "at" o "crontab" y los llames desde el programa en C con los parametros correspondientes (fecha de ejecución,comando a ejecutar, etc)

PD: es más.. ya que tienes un "sistema" domótico compuesto de diversos programas también podrías contemplar la posibilidad de usar un "script en bash" directamente para gestionar la programacion de tareas (invocando a alguno de los comandos que te he mencionado anteriormente) y olvidarte de C. Como tu lo veas más facil  ;)


Título: Re: Tareas programadas en C ¿Como?
Publicado por: dgg006 en 17 Junio 2011, 14:48 pm
Hola dakomt.
Me alegro que recuerdes mi proyecto, y si,  mi bebe está creciendo a pasos agigantados  ;D

Entiendo lo que dicen sobre la ineficiencia de lo que busco. Voy a buscar sobre los comandos que me pasaste,.


Para Died:
Hice un par de modificaciones en el codigo que me pasaste, y casi funciona.
Código:
#include <string.h>
#include <stdio.h>
#include <time.h>
 
char buffer [40];
 
char *times ()
{
time_t now = time (0);
struct tm *ahora;
ahora=localtime ((const time_t*)&now);
strftime (buffer, 40, "%H:%M", ahora);
return (char *) buffer;
}
 
int main ()
{
if (strcmp (times (), "20:45") == 0)
      printf ("1");
else
      printf ("0");
 
return 0;
}
 

Donde dice "20:45" es donde se ingresa la hora que quieres.
La pregunta es, si tengo la hora en un TXT, que comando uso???
Ya he trabajado con TXT pero este me confundió


Título: Re: Tareas programadas en C ¿Como?
Publicado por: Died en 17 Junio 2011, 16:13 pm
Usa las funciones fopen (), fclose (), fgets (), etc...
Un saludo. Sagrini


Título: Re: Tareas programadas en C ¿Como?
Publicado por: dgg006 en 17 Junio 2011, 16:26 pm
Bueno, logre hacer esto, modificando el código que me paso Died:
Código:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <time.h>

char buffer [40];

char *times ()
{
time_t now = time (0);
struct tm *ahora;
ahora=localtime ((const time_t*)&now);
strftime (buffer, 40, "%H:%M", ahora);
return (char *) buffer;
}
int main ()
{
    char resul[6];
    int estado=-1;
    int infinito=0;
    int val;

    FILE *hora;
    hora = fopen ("Hora.txt","r");
    fscanf (hora, "%s",&resul);
    fclose (hora);

    FILE *valo;
    valo = fopen ("val.txt","r");
    fscanf (valo, "%d",&val);
    fclose (valo);

    while (infinito == 0)
    {

if (strcmp (times (),("%s", resul)) == 0)
{
    if (estado != 1)
            {
                printf ("Encendido");
                    FILE *valor;
                    valor = fopen ("valor.txt","w+");
                    fprintf (valor, "%d",val);
                    fclose (valor);
            }
                    estado=1;
                    return 0;
}
else
{
        if (estado != 0)
            {
                printf ("Apagado");
            }
                    estado=0;
}
    }
    return 0;
}

Parte buena, funciona...
Parte mala, Usa demasiados txt para mi gusto.
estaría bueno, poder encontrar la forma de que en el txt "Hora.txt" ademas de la hora, estuviera el 0 o el 1 que por ahora esta en "val.txt"

Los printf "Encendido" y "Apagado" están solo por ahora en la fase beta :P , en realidad no van


Título: Re: Tareas programadas en C ¿Como?
Publicado por: Died en 18 Junio 2011, 10:44 am
Te revisaré tu código:
Código
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4.  
  5. char buffer [40];
  6. char hora [5];
  7. FILE *fp;
  8.  
  9. char *times ()
  10. {
  11. time_t now = time (0);
  12. struct tm *ahora;
  13. ahora=localtime ((const time_t*)&now);
  14. strftime (buffer, 40, "%H:%M", ahora);
  15. return (char *) buffer;
  16. }
  17.  
  18. int main ()
  19. {
  20. fp = fopen ("hora.txt","r+");
  21. fgets (hora, 5, fp);
  22.  
  23. while (strcmp (times (), hora) != 0) { }
  24.  
  25. printf ("Encendido");
  26. fputs ("\n\nHello!\n", fp);
  27.  
  28. fclose (fp);
  29. return 0;
  30. }
  31.  

No entendía muy bien el propósito de tu código, así que más o menos he hecho un resumen de tu idea. Te puntualizo varios puntos
1) No usas conio.h  y sin embargo lo pones. Nada recomendable. Y te recuerdo que es mejor no usar nunca conio.h para nada.
2) Tu código es en exceso largo. Intenta hacerlos cuanto más claros mejor.
3) A la hora de escribir el código, no uses espacios. Usa siempre el tabulador, aunque acabe siendo larguísimo.
4) En la comparación habías puesto algo un poco raro. Creo que querías poner eso.
5) Cuantas menos variables, mejor.

Un saludoy suerte! Sagrini


Título: Re: Tareas programadas en C ¿Como?
Publicado por: dgg006 en 18 Junio 2011, 14:08 pm
Muchas gracias por los consejos.. El de usar conio fue algo que me pego la profesora y me cuesta sacarlo :P.

yo en realidad, no comprendo muy bien que hace tu codigo, o por lo menos es completamente distinto a el que pasé anteriormente.

Te doy los pasos para que pruebes el programa, porque pienso que no lo lograste entender.

* En el TXT "Hora.txt"   =  Va solo la hora en la que se ejecutará la tarea, en formato HH:MM (23:30).
* En el TXT "val.txt"    =   Va el valor que se va a enviar al otro TXT (0 o 1)
* En el TXT "valor.txt"   =   Sera donde se escriba el contenido de val.txt

Solo ejecuta el programa en la misma carpeta, y en hora txt ponelo un par de minutos adelantado, asi tenes tiempo de ver lo q hace.


Título: Re: Tareas programadas en C ¿Como?
Publicado por: Died en 19 Junio 2011, 16:29 pm
Ya sé lo que hace :P
La cosa es que te tienes que fijar en la lógica por la cual el programa compara las horas, porque el tuyo la tiene mal.

Dile a tu profe que es una cafre :D
Un saludo! Sagrini