2011-01-16 5 views
1

私は特定の時間に自分のアプリケーションを起動する必要があります。私はコーンの仕事に入れたくありません。私の実行ファイルはアプリケーションで、2011年1月20日から開始するようです ./app -date 2011-Jan-20時間を待つ

ここで問題は、どのように時間差を計算しますか現在および日付はコマンドラインオプションで指定します。

私はウォン機能を書いたくありません。このような種類の時間差にはビルド機能がありますか? (CおよびLinux)

+2

私はあなたがしたいことを十分に理解していませんか?今すぐコマンドを実行できるようにするコードをアプリケーションに書き込もうとしていますが、起動するタイミングをタイマーで確認していますか?そしてCronシステムの何が問題になっていますか?本当にうまく動作する試行錯誤のシステムです。 – jmort253

+1

なぜ*あなたが 'cron'を使いたくないのか説明できれば、あなたの質問にもっとよく答えるかもしれません。 – Tony

+2

「man at」はあなたのために役立つかもしれません。 – Benoit

答えて

1

開始時間と現在のミリ秒の差を計算し、その数値をタイムアウト引数としてselect()またはepoll()に渡すことで、そのミリ秒間待機することができます。

の差を計算するために、一つの方法は、最初strptime()を使用してstruct tmにあなたの日付文字列を変換し、あなたのUNIXエポック1970-01-01夜12時00分からの秒数を与えようとしているmktime()にそれを渡すことです: 00。 gettimeofday()またはclock_gettime()を使用して現在の時刻を取得すると、ユニックスエポックからの経過時間も報告されます。開始時刻と現在時刻を秒に変換して値を減算します。

+0

新しいカーネルでは、この方法で[timerfd](http://www.kernel.org/doc/man-pages/online/pages/man2/timerfd_create.2.html)を使うべきです。 –

+0

@Sam: 'timerfd()'は素晴らしい機能ですが、必須ではありません。 http://monkey.org/~provos/libevent/のようなイベントデマルチプレクスライブラリは、通常、最も早いタイマー満了またはファイル記述子の準備やシグナルまで待つために 'select()'にタイムアウト引数を使います。言い換えると、実装レベルでは、すべてのタイマーを同時に待つようにスケジュールする必要はなく、最も早いタイマーまで待機する必要があります。 –

4

私はあなたがC答えを期待している知っているが、これはあなたが興味があります

あなたは、Linuxにしているので、システムがすでにponctualタスクをスケジュールするための効率的な方法を提供します:at

あなたの場合、午前8時2011年1月20日に彼のタスクを実行したいユーザーに

は、ちょうど入力します。

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

タスクは、ユーザーの資格情報を使用して実行されます。 atは、at now +1 dayのような相対時間指令も受け入れます。これはデフォルトでほとんどのLinuxディストリビューションに同梱されている強力なツールです。

atq 

そして、あなたも使用してスケジュールされたジョブを削除することができます:

atrm 

・ホープ、このことができます

スケジュールされたジョブのリストは、使用して取得することができます。

+2

実際には存在しない問題に対して、車輪を再構築したり、睡眠を失ったりする理由。私は男があなたの答えを受け入れるべきだと思う。これは知って良いです! – jmort253

関連する問題