0

我的问题很笼统,但我会用一个具体的例子来解释它。

假设我需要在两个应用程序之间进行时间通信。一种简单的方法是让一个应用程序将gettimeofday()(tv_sectv_usec) 的输出写入文件并让另一个应用程序读取它。第二个应用程序需要“转换”字符串以获得timeval.

有什么办法可以避免转换?

有没有比简单的文件写入/读取更好的方法来做到这一点?

4

1 回答 1

3

假设两个进程在同一台机器上(或至少在相同架构的机器上),std::time()(from <ctime>) 的结果将是自 Epoch 以来的秒数,并且不需要任何转换:

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

免责声明:这不是的最佳方法,您需要在写入文件时锁定文件以供读取。只是回答问题。


更新,以下评论。

如果您需要编写 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处理(当文件不存在时);您需要将此添加到任何具有生产价值的代码中。

于 2013-02-20T03:16:32.253 回答