linuxで現在日時を取得するシステームコール

このQ&Aのポイント
  • Linuxで現在の日時を取得するシステームコールについて調査しました。
  • 特定のシステムコールを使用して、システムの現在日時を取得する方法について検討しています。
  • 試したシステムコールでは、日時の取得に問題がありましたが、他の方法を検討しています。
回答を見る
  • ベストアンサー

linuxで、現在日時を取得するシステームコール

いつも参考にさせて頂いてます。 現在、Androidのミドル層(正確にはHAL)にて、linuxのシステムコールを用いて システムの現在日時を取得したいと考えております。 出来ればシステム時刻、それがダメであればRTCでも構わないのですが、 何か一度にまとめて取得できるシステムコールはありませんでしょうか? 試しに以下のシステムコールを試したのですが、tmの中身が全て0で 返ってきてしまいました。 char *asctime(const struct tm *tm); そもそも上記のように一度で取得できるものではなく、 以下のようなシステムコールでまず元ネタを取得し、 それを別のシステムコールで年月日に変換するようなイメージなのでしょうか? int clock_gettime(clockid_t clk_id, struct timespec *tp); すみませんが、ご回答やアドバイスの程、よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.1

マニュアルを見ないで関数やシステムコールを使うのは無理ですよ。 asctimeは、日時の表現形式を変換するライブラリ関数です。また、tm は、入力値で、出力値ではありません。 日時を得るシステムコールは、time または gettimeofday です。

hiroandroid
質問者

お礼

回答ありがとうございます。 time()とlocaltime()を使用して、無事システム時刻を取得する事が出来ました。

関連するQ&A

  • clock_gettime()について

    clock_gettime()について質問です。 http://kazmax.zpp.jp/cmd/c/clock_getres.3.html にある、 「関数 clock_gettime ()は、指定されたクロック clk_id の時間を取得する。」 という説明が理解できないのです。 分解能は理解できます。 "クロックの時間"とは何をさすのでしょうか? 1クロックあたりが何秒かということでしょうか? 1クロックが何秒に相当するのか、何ナノ秒に相当するのかが メンバtv_secとtv_nsecにそれぞれ格納されるのでしょうか? struct timespec { time_t tv_sec; /* 秒 */ long tv_nsec; /* ナノ秒 */ }; ご教示ください。

  • clock_gettimeでミリ秒の時間差分の取得

    Linux(CentOS)、C言語で2点の時間の差分をclock_gettimeでミリ秒単位で取得したいと考えています。 マニュアルを参照しましたが、 引数のtimespecの構造と単位が理解できませんでした。 できれば、サンプルコードをつけて教えていただけないでしょうか? よろしくお願い致します。

  • リアルタイムクロック

    RTC-7301SF(EPSON TOYOCOM)とゆうリアルタイムクロックを使用し、 その計時データをシリアル通信させて、時計機能の確認をしようと しているのですが・・・ 下記のプログラムをステップで実行させると、 ちゃんと時計が進むような形で表示できるのですが、 ループで回すと最初に書いたデータがそのまま 出力され、時計が進んでないような表示になります。 void Rtc_Read(void) {  struct RTC_TIME rtc_clock;    //RTC構造体  if(CONTROL_REG.BIT.BUSY_ADJ){ //BUSYフラグをチェック   usec_timer(TIME_244US);   return;   }   else{   rtc_Get_data(&rtc_clock); //RTC構造体の取得   rtc_time_str(&rtc_clock); //文字列に変換し、シリアル送信   } } シリアル送信後に1秒のウェイトを入れています。 ステップで動作するのに、ループで回すと動作しないとゆうことに なっていて、行き詰っています。 何か参考になるような意見いただければありがたいです。 よろしくお願いします。

  • 現在日時から、任意の時日時を求めるには

    いつもお世話になっています。 いま、現在時刻を取得し、その日付からみて1日前のAM6時へ設定するという処理を作りたいのですが、思うようにできない状態です。 多分、"time(&timer)"で現在時刻を取得し、localtime関数で構造体へ変換してから、値を変更するのだと思うのですが、その部分の処理がうまくできません。 どうかアドバイスをよろしくお願いします。 #include<stdio.h> #include<time.h> void main(){ /* ----------- [ 変数の宣言 ]*/ int i; int sts; int res; time_t timer; time_t ans; struct tm *t_st; /* 現在時刻を取得 */ time( &timer ); t_st = localtime(&timer); t_st->tm_mday - 1; /* ←"コードは意味を持たない"という警告が発生*/ t_st->tm_hour = 6; timer = mktime(t_st); t_st = localtime(&timer); sprintf("%Y/%m/%d %H:%M", -- 以下略 -- }

  • Arduinoでコンパイルエラーについて

    お世話になります。 Arduinoで検証すると「コンパイル時にエラーが発生しました。」と出ますがスケッチ上に黄色い帯が出ません。 なにが原因なのでしょう? 参考にしたスケッチ http://www.mauroalfieri.it/en/elettronica/data-logging-con-arduino.html これに「RTClib.h」というファイルを同じ場所に置きました。 テキストファイルに以下のスケッチをコピーし「RTClib.h」を作成します。 // Code by JeeLabs http://news.jeelabs.org/code/ // Released to the public domain! Enjoy! // Simple general-purpose date/time class (no TZ / DST / leap second handling!) class DateTime { public: DateTime (uint32_t t =0); DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour =0, uint8_t min =0, uint8_t sec =0); DateTime (const char* date, const char* time); uint16_t year() const { return 2000 + yOff; } uint8_t month() const { return m; } uint8_t day() const { return d; } uint8_t hour() const { return hh; } uint8_t minute() const { return mm; } uint8_t second() const { return ss; } uint8_t dayOfWeek() const; // 32-bit times as seconds since 1/1/2000 long secondstime() const; // 32-bit times as seconds since 1/1/1970 uint32_t unixtime(void) const; protected: uint8_t yOff, m, d, hh, mm, ss; }; // RTC based on the DS1307 chip connected via I2C and the Wire library class RTC_DS1307 { public: static uint8_t begin(void); static void adjust(const DateTime& dt); static void sqw(int sqw); uint8_t isrunning(void); static DateTime now(); }; // RTC using the internal millis() clock, has to be initialized before use // NOTE: this clock won't be correct once the millis() timer rolls over (>49d?) class RTC_Millis { public: static void begin(const DateTime& dt) { adjust(dt); } static void adjust(const DateTime& dt); static DateTime now(); protected: static long offset; }; みなさま、どうかよろしくお願い致します。

  • SQLServer 列の「説明」の取得について

    SQLDMOオブジェクトを用いて、テーブルの列挙、列の列挙までは行なえるようですが、列の「説明」の項目の取得は行なえないのでしょうか? SQLDMOでなくても、何か取得出来る方法があればご教授お願いします。 --サンプル Public Function Main() Dim objServer As SQLDMO.SQLServer Dim objDatabase As SQLDMO.Database Dim objTables As SQLDMO.Tables Dim curTable As SQLDMO.Table Dim curCOl As SQLDMO.Column Const DB_NAME As String = "local" Const DB_USER As String = "sa" Const DB_PASSWD As String = "password" Const DB_USE As String = "hoge" ' オブジェクト作成 Set objServer = CreateObject("SQLDMO.SQLServer") ' 接続 Call objServer.Connect(DB_NAME, DB_USER, DB_PASSWD) 'DB選択 Set objDatabase = objServer.Databases(DB_USE) 'テーブル一覧 Set objTables = objDatabase.Tables ' テーブルの列挙 For Each curTable In objTables If curTable.SystemObject Then Debug.Print curTable.Name & " [system]" Else Debug.Print curTable.Name '列名の列挙 For Each curCOl In curTable.Columns Debug.Print curCOl.Name '*!ここで列の説明は取得出来ないのでしょうか??? Next End If Next ' 切断 Call objServer.Disconnect End Function

  • 時刻取得について

    C言語において時刻取得を以下のようにプログラムしたら、プログラムを3回目以上実行すると前回時間内容が常に1回目が表示されてしまいます。どこを直せばちゃんと前回の時刻が正しく表示されるようになるのでしょうか。put()のfopenの"a"の部分は"w"に変えるだけで正しく実行されるのですが、これを"a"にした場合について正しく表示されるようにするということです。 #include <time.h> #include <stdio.h> void get(void); void put(void); char data_file[] = "time.dat"; int main(void) { get(); put(); return(0); } /* 前回の日付・時刻を読込む   */ void get(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); if ((fp = fopen(data_file, "r")) == NULL){ printf("\a本プログラムを実行するのは初めて\n"); }else { int year, month, day, h, m, s; fscanf(fp, "%d %d %d", &h, &m, &s); printf("前回は%d時%d分%d秒\n", h, m, s); fclose(fp); } } /* 今回の日付・時刻を書き込む   */ void put(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); if ((fp = fopen(data_file, "a")) == NULL) printf("\aファイルをオープンできません。\n"); else { printf("現在の日付・時刻を書き出しました。\n"); fprintf(fp, "%d %d %d\n", local->tm_hour, local->tm_min, local->tm_sec ); fclose(fp); } }

  • 仮想基底クラスをもつクラスの代入演算

    仮想基底クラスをもつクラスの代入演算で、仮想基底クラスの代入が各々のサブオブジェクトにつきただ一回なされるようにしたい場合に、みなさん、どのように設計されていますか? 何か、手軽なテクニックがあれば、ご教示ください。 ===(コンストラクタなどは略、アクセス制御も略) たとえば、 struct X { int x; }; struct A : virtual X { int a; }; struct B : virtual X { int b; }; struct C : A, B { int c; }; int main() { C c1, c2; c1 = c2; } として、デフォルト代入に頼ると、c1.x への c2.x の代入を複数回行うコンパイラが多いですよね(というか、きっちり1回のみ行うようにしているコンパイラに出会ったことがない)。C++標準でも、初期化はただ一度とコンパイラが保証するようになっていますが、代入は何度代入してもいいようになっていたと思います。 以下のように、各クラスで、直接の非仮想基底クラスと自身のデータメンバにのみ代入するメンバ関数を定義して、最派生クラスでのみ、仮想基底クラスの代入を行うのが、普通のやり方なんでしょうか。 これでもいいのですが、後に、ある基底クラスに仮想クラスが付け加わったりすると、その基底クラスから派生しているクラスの代入演算の定義をすべていじらないといけなくなるので、もっといいテクニックがあるのなら、と思いまして質問したしだいです。 struct X { int x; X &nvAssign(const X &z) { x = z.x; return *this; } X &operator=(const X &z) { nvAssign(z); } }; struct A : virtual X { int a; A &nvAssign(const A &z) { a = z.a; return *this; } A &operator=(const A &z) { X::nvAssign(z); return nvAssign(z); } }; struct B : virtual X { int b; B &nvAssign(const B &z) { b = z.b; return *this; } B &operator=(const B &z) { X::nvAssign(z); return nvAssign(z); } }; struct C : A, B { int c; C &nvAssign(const C &z) { A::nvAssign(z); B::nvAssign(z); c = z.c; return *this; } C &operator=(const C &z) { X::nvAssign(z); return nvAssign(z); } }; === 1. 仮想基底クラスは何度代入されてもいいようにするもんだ。 2. 仮想基底クラスにデータメンバを持たせるのは間違いだ。 3. 遅くなるから、そもそも仮想基底クラスなど使わない。 という回答は無しでお願いいたします。たぶん、1 か 2 が正解なんでしょうけど^^

  • 構造体を用いた特定数値抽出方法について

    こんばんは。 前回、複数回実行方法および構造体の初期化について質問させていただいた者です。 VC++.NET2003を用いてコンソールプログラミングを行っています。 以下に前回示しました構造体を示します。この構造体は4つの整数型のメンバをもっています。 このNpktメンバ変数には、10から11000まで10ずつカウントアップされた値が格納されています。10,20,30,40・・・100,110・・・・11000ということです。そこで、Npktが100,200,300・・・の時のgettime,rPkt,lossPktメンバの値を抽出しファイル出力させたいと思い、以下に示しますプログラムを記述しました。 しかし、10,20,30,40・・・100,110・・・490,510,520・・・ という仮に500がない場合が存在し、Npktが500の値を取得できずにかつそれ以降の600,700・・・1000などを取得できない状態になってしまいます。 そこで、500がない場合は改行をファイル出力し600を探索しだすという方法を考えたのですが、うまく記述できません。 もしよろしければ、ヒントや記述方法を教えていただけないでしょうか? よろしくお願い致します。 (1)構造体 #define MAX 2000 struct tag{  int Npkt;  int gettime;  int rPkt;  int lossPkt; }rdata[MAX]; (2)プログラム概要 while(rdata[e].Npkt!='\0'){  if(rdata[e].Npkt==sa){   de=100;   sa+=de;   fprintf(fp9,"%d\t%d\t%d\t%d\n",rdata[e].Npkt,rdata [e].gettime,rdata[e].rPkt,rdata[e].lossPkt);  }  e++; }

  • 取得日時

    取得日時 ってなんていいますか? Obtained Date?