我的问题很笼统,但我会用一个具体的例子来解释它。
假设我需要在两个应用程序之间进行时间通信。一种简单的方法是让一个应用程序将gettimeofday()
(tv_sec
和tv_usec
) 的输出写入文件并让另一个应用程序读取它。第二个应用程序需要“转换”字符串以获得timeval
.
有什么办法可以避免转换?
有没有比简单的文件写入/读取更好的方法来做到这一点?
假设两个进程在同一台机器上(或至少在相同架构的机器上),std::time()
(from <ctime>
) 的结果将是自 Epoch 以来的秒数,并且不需要任何转换:
std::time_t seconds_since_epoch = std::time(NULL);
免责声明:这不是ipc的最佳方法,您需要在写入文件时锁定文件以供读取等。只是回答问题。
更新,以下评论。
如果您需要编写 a timeval
,也许最简单的方法是按原样定义<<
和>>
运算符 fortimeval
并将它们作为文本写入和读取文件(无需担心字节顺序)(无需转换):
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
处理(当文件不存在时);您需要将此添加到任何具有生产价值的代码中。