C言語でrtcwakeの内部処理と同様の処理を行って、ユーザから受け取った時刻に基づいてサスペンドしてレジュームする処理を考えています。
このとき、rtcwakeでは年月日時分秒の形式で起動時刻を与える必要がありますが、時刻だけ受け取って設定したいです。
その時、与えられた時刻が現在より前の時刻であった場合、それを翌日の時刻として取り扱いたく思っております。
struct rtc_timeのtm_mdayを単純に一つインクリメントすれば良いかと思ったのですが、実際には翌日が来月の可能性と来年の可能性、あるいはその双方である可能性や、月末であった場合に30日までなのか31日までなのか、うるう年かどうかなどの判定を行う必要があると思いました。
このような場合、愚直に条件分岐で日付を判定するしかないでしょうか。
ちなみに、rtcwwakeで実際にRTCタイマをセットしている関数は下記の通りです。
static int setup_alarm(struct rtcwake_control *ctl, int fd, time_t *wakeup) { struct tm tm; struct rtc_wkalrm wake = { 0 }; /* The wakeup time is in POSIX time (more or less UTC). Ideally * RTCs use that same time; but PCs can't do that if they need to * boot MS-Windows. Messy... * * When clock_mode == CM_UTC this process's timezone is UTC, so * we'll pass a UTC date to the RTC. * * Else clock_mode == CM_LOCAL so the time given to the RTC will * instead use the local time zone. */ localtime_r(wakeup, &tm); wake.time.tm_sec = tm.tm_sec; wake.time.tm_min = tm.tm_min; wake.time.tm_hour = tm.tm_hour; wake.time.tm_mday = tm.tm_mday; wake.time.tm_mon = tm.tm_mon; wake.time.tm_year = tm.tm_year; /* wday, yday, and isdst fields are unused */ wake.time.tm_wday = -1; wake.time.tm_yday = -1; wake.time.tm_isdst = -1; wake.enabled = 1; if (!ctl->dryrun && ioctl(fd, RTC_WKALM_SET, &wake) < 0) { warn(_("set rtc wake alarm failed")); return -1; } return 0; }
上記のtm_mday, tm_mon, tm_yearを定義しなかったり、-1にしたりすると、ioctlでエラーとなってしまいます。
ご教示いただけますと幸いです。よろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/20 01:32
2021/07/20 01:35
2021/07/20 05:39
2021/07/20 07:10
2021/07/20 08:32
2021/07/20 08:34
2021/07/20 08:36
2021/07/20 08:41 編集
2021/07/20 09:29
2021/07/20 09:42
2021/07/20 22:09
2021/07/20 23:54
2021/07/21 00:17
2021/07/21 00:32
2021/07/21 07:17 編集