所以我曾经使用IPC的命名管道,但后来我丢失了从一个进程发送的第一个值,因为另一个进程尚未启动。所以我接着使用只有一行作为中间存储的文件。
因此,当我的应用程序写入文件时,文件正在更新。这是代码:
dmHubRead = fopen ("/tmp/file", "w");
if (!dmHubRead) {
log_error ("can't create /tmp/file: %m");
return 0;
}
fprintf (dmHubRead,
"value %02d:%02d:%02d;\n",
t->x, t->y, t->z);
fflush (dmHubRead);
fclose(dmHubRead);
我的其他程序然后打开文件,并且想要经常阅读第一行。该程序不会在读取之间关闭文件。 以下是该程序的代码:
if ((_file = fopen(FILE_PATH, "r")) < 0) {
DebugLogger::put(DebugLogger::Error, "Could not open file.", __FILE__, __LINE__);
}
...
size_t sz = 0;
char *line = NULL;
if(fsync(fileno(_file)) < 0) {
perror("fsync");
}
rewind(_file);
getline(&line, &sz, _file);
所以我的问题是这不起作用。写作部分中的fopen每次都会创建一个新文件吗?或者问题是什么以及如何解决?
答案 0 :(得分:1)
您的“写作”方面每次运行时都会创建一个新文件。读取端失败,因为每次写入新文件时文件句柄都会变为无效。如果每次访问时都重新打开文件,那么代码应该可以正常工作。正如约阿希姆所提到的,有更优雅的方法可以做到这一点。您还没有提到您正在运行的系统。根据它是Windows,Linux还是其他一些操作系统,有更好的IPC机制。您还有同步问题。您的读取是否可以在新文件打开和写入数据之间发生?如何使用套接字?这样你就可以判断是否还有新的数据在等待。