2011-01-16 12 views
1

Ich habe eine Anforderung, meine Anwendung zu einer bestimmten Zeit zu starten. Ich möchte nicht in den Mais-Job gesteckt werden. Meine ausführbare Datei ist eine Anwendung, und wie am 2011-Jan-20 starten So habe ich es als ./app laufen -date 2011-Jan-20warten Sie eine Zeit

Hier Problem ist, wie ich die Zeitdifferenz berechnet wird aus Datum und Uhrzeit in der Befehlszeilenoption angegeben.

Ich möchte keine Won-Funktion schreiben. Gibt es für diese Art von Zeitdifferenz irgendwelche In-Build-Funktionen? (C und Linux)

+2

Ich bin mir nicht sicher, ob ich vollständig verstehe, was Sie tun möchten? Versuchen Sie, Code in Ihrer App zu schreiben, mit dem Sie den Befehl jetzt ausführen können, aber einen Timer verwenden, um zu wissen, wann er starten soll? Und was stimmt nicht mit dem Cron-System? Es ist ein erprobtes System, das wirklich gut funktioniert. – jmort253

+1

Wenn Sie erklären könnten, warum Sie nicht 'cron' verwenden möchten, könnten die Leute Ihre Frage besser beantworten. – Tony

+2

Vielleicht könnte 'man at' für dich nützlich sein. – Benoit

Antwort

1

Sie können den Unterschied zwischen der Startzeit und jetzt in Millisekunden berechnen und dann auf diese vielen Millisekunden warten, indem Sie diese Zahl als Timeout-Argument an select() oder epoll() übergeben.

den Unterschied zu berechnen, ist eine Möglichkeit, Ihr Datum Zeichenfolge struct tm zum ersten strptime() mit konvertieren und dann zu mktime() passieren, die Ihnen seit dem Unix-Epoche eine Anzahl von Sekunden geben werden 1970-01-01 00.00: 00. Dann erhalten Sie die aktuelle Zeit mit gettimeofday() oder clock_gettime(), sie berichten auch die Zeit seit Unix-Epoche vergangen. Konvertiere die Startzeit und die aktuelle Zeit in Sekunden und subtrahiere die Werte.

+0

In neueren Kernen sollten Sie eine [timerfd] (http://www.kernel.org/doc/man-pages/online/pages/man2/timerfd_create.2.html) mit diesem Ansatz verwenden. –

+0

@Sam: 'timerfd()' ist eine nette Eigenschaft aber nicht wesentlich. Event-Demultiplex-Bibliotheken wie http://monkey.org/~provos/libevent/ verwenden normalerweise das Timeout-Argument für 'select()', um auf den frühesten Timer-Ablauf oder die Datei-Deskriptor-Bereitschaft oder ein Signal zu warten. Mit anderen Worten, auf der Implementierungsebene müssen Sie nicht für alle Timer gleichzeitig planen, sondern nur bis zum frühesten. –

4

Ich weiß, Sie erwarten eine C Antwort, aber dies könnte Sie interessieren:

Da Sie auf Linux sind, bietet das System bereits eine effiziente Art und Weise ponctual Aufgaben zu planen: at

In Ihrem Fall ein Benutzer, der würde nur geben um 8 Uhr seine Aufgabe auf dem 20.01.2011 ausgeführt werden soll: die Anmeldeinformationen des Benutzers

echo "./app" | at 08:00 20.01.2011 

die Aufgabe verwendet werden ausgeführt. Beachten Sie, dass at auch relative Zeitrichtlinien wie at now +1 day akzeptieren. Es ist ein mächtiges Werkzeug, das standardmäßig mit den meisten Linux-Distributionen ausgeliefert wird.

Die Liste der geplanten Aufträge mit erhalten werden können:

atq 

Und Sie können sogar geplante Aufträge entfernen Verwendung:

atrm 

Hoffnung, das hilft.

+2

Warum erfinden Sie das Rad neu oder verlieren Sie Schlaf über ein Problem, das nicht wirklich existiert. Ich denke, der Typ sollte deine Antwort akzeptieren. Das ist gut zu wissen! – jmort253

Verwandte Themen