我有这个工具,其中一个类似日志的文件由多个进程写入。
我想要实现的是在第一次打开文件时将其截断,然后由打开它的几个进程在最后完成所有写入。所有写入都被系统地刷新和互斥保护,这样我就不会得到混乱的输出。
首先,一个进程创建文件,然后启动一系列其他进程,一次一个,然后打开文件并写入文件(主进程有时会插入其他内容;从进程可能打开也可能不打开,并且写东西)。
我希望尽可能不使用更多已经存在的 IPC(我现在所做的只是写入一个 popen 创建的管道)。除了 CRT 和 Win32 API,我无法访问外部库,我不想开始编写序列化代码。
这是一些代码,显示了我去了哪里:
// open the file. Truncate it if we're the 'master', append to it if we're a 'slave'
std::ofstream blah(filename, ios::out | (isClient ? ios:app : 0));
// do stuff...
// write stuff
myMutex.acquire();
blah << "stuff to write" << std::flush;
myMutex.release();
好吧,这是行不通的:尽管从进程的输出按预期排序,但主进程写入的内容要么是捆绑在一起,要么是在错误的地方,如果它根本存在的话。
我有两个问题:给ofstream的构造函数的标志组合是正确的吗?反正我走对了吗?