2012-01-31 71 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機制。你也有同步的問題。您可以在新文件打開和寫入數據之間進行讀取嗎?如何使用套接字?這樣你就可以知道是否有新的數據在等待。