0

My question is general, but I will explain it using a specific example.

Suppose I need to communicate time between two applications. A simple way is to have one application write the output of gettimeofday() (tv_sec and tv_usec) to a file and let the other app read it. The second app needs to 'convert' the strings in order to get an instance of timeval.

Is there any way to avoid the conversion?

Is there a better way to do this than simple file write/read?

4

1 に答える 1

3

両方のプロセスが同じマシン上にある(または少なくとも同じアーキテクチャのマシン上にある)と仮定すると、std::time()(からの<ctime>)の結果はエポックから数秒であり、変換は必要ありません。

std::time_t seconds_since_epoch = std::time(NULL);

免責事項:これはなどに読み取るためにファイルをロックする必要があります。質問に答えるだけです。


コメントに続いて更新します。

を書く必要がある場合timeval、おそらく最も簡単な方法は、これらを定義<<し、>>演算子をtimevalファイルにテキストとして書き込み、読み取ることです(バイト順序を気にする必要はありません)。そのまま(変換なし):

std::ostream& operator <<(std::ostream& out, timeval const& tv)
{
    return out << tv.tv_sec << " " << tv.tv_usec;
}

std::istream& operator >>(std::istream& is, timeval& tv)
{
    return is >> tv.tv_sec >> tv.tv_usec;
}

これにより、次のことが可能になります(並行性を無視します)。

// Writer
{
    timeval tv;
    gettimeofday(&tv, NULL);
    std::ofstream timefile(filename, std::ofstream::trunc);
    timefile << tv << std::endl;
}

// Reader
{
    timeval tv;
    std::ifstream timefile(filename);
    timefile >> tv;
}

両方のプロセスが同時に実行されている場合は、ファイルをロックする必要があります。Boostを使用した例を次に示します。

// Writer
{
    timeval tv;
    gettimeofday(&tv, NULL);
    file_lock lock(filename);

    scoped_lock<file_lock> lock_the_file(lock);

    std::ofstream timefile(filename, std::ofstream::trunc);
    timefile << tv << std::endl;
    timefile.flush();
}

// Reader
{
    timeval tv;
    file_lock lock(filename);

    sharable_lock<file_lock> lock_the_file(lock);

    std::ifstream timefile(filename);
    timefile >> tv;

    std::cout << tv << std::endl;
}

exception...わかりやすくするために(ファイルが存在しない場合)処理を省略しました。これを本番環境に適したコードに追加する必要があります。

于 2013-02-20T03:16:32.253 に答える