我的问题很笼统,但我会用一个具体的例子来解释。
假设我需要在两个应用程序之间传递时间。一种简单的方法是让一个应用程序将gettimeofday()
(tv_sec
和tv_usec
)的输出写入文件,让另一个应用程序读取它。第二个应用程序需要“转换”字符串才能获得timeval
的实例。
有没有办法避免转换?
有没有比简单文件写/读更好的方法呢?
答案 0 :(得分:3)
假设两个进程都在同一台机器上(或至少在同一架构的机器上),std::time()
(来自<ctime>
)的结果将为seconds since the Epoch,并且不会需要任何转换:
std::time_t seconds_since_epoch = std::time(NULL);
免责声明:这不是ipc的最佳方法,在撰写时,您需要to lock the file进行阅读,等。只是回答这个问题。
更新,发表评论。
如果您需要编写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
处理(当文件不存在时);你需要将它添加到任何具有生产价值的代码中。