--
Qui si usa Linux
http://www.puppylinux.org
Antefatto:
Al primo avvio del mio pc parte un programma (principale) che calcola le
effemeridi solari e
segna su un file di testo il minuto esatto dei vari eventi previsti per
quel giorno.
Il crontab è regolato per scattare ogni minuto e, quando arriva uno dei
minuti
previsti su quel file (alba, tramonto, culminazione ecc. ma anche
qualsiasi altra cosa)
fa partire una serie di effetti corrispondenti: cambio dello sfondo e
delle icone, suoni, avvisi ecc.
Inoltre al primo avvio i dati con il minuto del verificarsi di ciascun
evento
solare vengono aggiunti a un altro file di testo che serve a costruire
giorno
dopo giorno delle statistiche annuali.
Esso va aggiornato una sola volta per giorno, non ogni volta che si
riaccende il computer.
Finora ho ottenuto questo con un paio di righe della shell,usando grep,
ma adesso vorrei affidare anche questo compito al programma principale.
Quesito: col C, come controllare in un file l'esistenza di una riga già
contenente
la data corrente per decidere se aggiornare o meno?
Saluti.
--
Creato con il rivoluzionario client e-mail di Opera:
http://www.opera.com/mail/
> Ho da aggiornare una specie di statistica giornaliera aggiungendo ogni
> giorno in coda a un file una nuova riga, una sola volta al giorno(!).
> ...
man anacron
Addì venerdì 18 dicembre 2009 16:41 Tantumergo scrisse:
> ...
> Adesso ci pensa la shell di Bash con grep a bloccare ogni
> duplicazione di righe, ma, essendo la fonte degli aggiornamenti
> un programma in C, vorrei affidare ad esso anche questa
> funzione. How to?
Semplicemente prima di aggiornare il log esegui un controllo per
evitare la duplicazione. Puoi implementare da solo una funzione
per ricercare una stringa od usare le librerie C per le espressioni
regolari.
> Il crontab è regolato per scattare ogni minuto e, quando arriva uno dei
> minuti
> previsti su quel file (alba, tramonto, culminazione ecc. ma anche
> qualsiasi altra cosa)
> fa partire una serie di effetti corrispondenti: cambio dello sfondo e
> delle icone, suoni, avvisi ecc.
Cioè il tuo programma imita crontab oppure crontab avvia il tuo programma
che avvia altri programmi?
Perché non usi direttamente fcron?
Addì venerdì 18 dicembre 2009 20:36 Tantumergo scrisse:
> ...
> Inoltre al primo avvio i dati con il minuto del verificarsi di ciascun
> evento
> solare vengono aggiunti a un altro file di testo che serve a costruire
> giorno
> dopo giorno delle statistiche annuali.
> ...
Questo può ottenersi molto facilmente facendo avviare il tuo programma
mediante anacron (o fcron) magari con una opzione che gli fa solo
aggiornare le statistiche.
Addì venerdì 18 dicembre 2009 20:36 Tantumergo scrisse:
> ...
> Quesito: col C, come controllare in un file l'esistenza di una riga già
> contenente
> la data corrente per decidere se aggiornare o meno?
Gli algoritmi per la ricerca di stringhe sono tra gli algoritmi fondamentali
ed il C ha delle funzioni standard per le espressioni regolari.
> Addì venerdì 18 dicembre 2009 20:36 Tantumergo scrisse:
>
>
>
> Cioè il tuo programma imita crontab oppure crontab avvia il tuo
> programma che avvia altri programmi?
> Perché non usi direttamente fcron?
>
Ho un unico file crontab che scatta ogni minuto:
* * * * * /dir/SCRIPT
SCRIPT (di shell) richiama il programma principale in C
ogni minuto. Quest' ultimo esegue tutto ciò che in esso
è previsto per quel minuto della giornata
Per minuto intendo=ora*60+min.
Il mezzogiorno civile, non quello solare locale,
avviene ad esempio al minuto 720.
Lo script:
a=`principale`
gmessage $a
Il crontab non costituisce problema.
>
> Questo può ottenersi molto facilmente facendo avviare il tuo
> programma mediante anacron (o fcron) magari con una opzione che gli
> fa solo aggiornare le statistiche.
Vedrò le opzioni dei due suddetti.
Qui si tratta di un file che deve avere una e una sola riga di
aggiornamento al giorno. Con uno script di shell e grep
attualmente così è, ma io vorrei far svolgere il compito
direttamente al programma principale in C.
Due righe d'esempio: la riga relativa ad oggi deve poter essere
aggiunta solo se non già presente, come in questo caso.
---
2009/12/16 - Prime luci 6:19 Alba 7:26 Culminazione 11:59
Tramonto 16:31 Notte 17:38 Durata giorno 9:05
2009/12/17 - Prime luci 6:20 Alba 7:27 Culminazione 11:59 Tramonto
16:32 Notte 17:39 Durata giorno 9:05
2009/12/18 - Prime luci 6:20 Alba 7:27 Culminazione 11:59
Tramonto 16:32 Notte 17:39 Durata giorno 9:05
---
Gli orari sono riferiti escusivamente a latitudine e longitudine locali.
>
>
> Gli algoritmi per la ricerca di stringhe sono tra gli algoritmi
> fondamentali ed il C ha delle funzioni standard per le espressioni
> regolari.
>
Andrò a cercarle.
Saluti e auguri di buone feste.
--
che roba complicata.
Conviene far andare il programma principale una volta all'anno e
fargli calcolare le effemeridi per tutto l'anno, e poi cron fa quello
che deve.
Oppure fai fare direttamente al programma C le cose che adesso fai
fare a cron (hint: sleep()).
Ciao Jack
<..omissis..>
> Oppure fai fare direttamente al programma C le cose che adesso fai
> fare a cron (hint: sleep()).
E' a questo che voglio arrivare. Un unico programma eseguibile che faccia
tutto da solo e che funzioni sul maggior numero possibile di pc.
Certo, con 1440 x 365 = 525600 minuti in un anno, hai voglia a programmarti
ogni momento della vita.
Sul "principale" reso annuale e non più giornaliero scriverei:
if (minuto == 452600) printf("Hai vinto alla lotteria\n");
E resterei in attesa, per vedere se i soldi arrivano veramente... :-)
Saluti e buone feste.
eh, allora lascia perdere il C e usa un linguaggio multipiattaforma
(java, python,...).
Ciao Jack