両方のプロセスが同じマシン上にある(または少なくとも同じアーキテクチャのマシン上にある)と仮定すると、std::time()
(からの<ctime>
)の結果はエポックから数秒であり、変換は必要ありません。
std::time_t seconds_since_epoch = std::time(NULL);
免責事項:これはipcの最良の方法ではなく、書き込み中などに読み取るためにファイルをロックする必要があります。質問に答えるだけです。
コメントに続いて更新します。
を書く必要がある場合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
...わかりやすくするために(ファイルが存在しない場合)処理を省略しました。これを本番環境に適したコードに追加する必要があります。