2012-01-31 74 views
0

所以我曾经为IPC使用命名管道,但后来我失去了从一个进程发送的第一个值,因为另一个进程尚未启动。所以我接着使用只有一行的文件作为中间存储。从文件中读取一行,并从其他进程重写该行。 C

因此,当我的应用程序写入文件时,文件正在更新。这里是代码为:

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

如果每次更改阅读部分以重新打开文件,问题是否消失? – NPE 2012-01-31 10:19:22

+0

当您以''w''模式打开文件时,它会被截断,这意味着您也可以使用此解决方案释放数据。你需要的是某种消息队列,例如见['man mq_overview'](http://linux.die.net/man/7/mq_overview)。 – 2012-01-31 10:29:57

回答

1

您的“写作”方在每次运行时都会创建一个新文件。读取端失败,因为每次写入新文件时文件句柄都变得无效。如果您每次访问文件时都重新打开文件,则代码应该可以正常工作。正如约阿希姆所说,有更多优雅的方式来做到这一点。你没有提到你正在运行的是什么系统。根据Windows,Linux或其他操作系统的不同,有更好的IPC机制。你也有同步的问题。您可以在新文件打开和写入数据之间进行读取吗?如何使用套接字?这样你就可以知道是否有新的数据在等待。