【问题标题】:Read one line from file while rewriting that line from other process. C从文件中读取一行,同时从其他进程重写该行。 C
【发布时间】:2012-01-31 10:13:01
【问题描述】:

所以我曾经为 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 每次都会创建一个新文件吗?或者是什么问题,如何解决?

【问题讨论】:

  • 如果每次更改读取部分重新打开文件,问题就消失了吗?
  • 当您以"w" 模式打开文件时,它会被截断,这意味着您也可以使用此解决方案丢失数据。你需要的是某种消息队列,例如man mq_overview

标签: c file-handling


【解决方案1】:

您的“写作”方面是在每次运行时创建一个新文件。读取端失败,因为每次写入新文件时文件句柄都会失效。如果您每次访问该文件时都重新打开它,那么您的代码应该可以工作。正如 Joachim 所提到的,有更优雅的方法可以做到这一点。你还没有提到你正在运行什么系统。根据是 Windows、Linux 还是其他操作系统,有更好的 IPC 机制。您还有同步问题。在打开新文件和写入数据之间是否会发生读取?使用套接字怎么样?这样您就可以判断是否还有新数据在等待。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2020-04-01
    相关资源
    最近更新 更多