【发布时间】:2009-04-12 22:49:08
【问题描述】:
我试图通过使用内存映射同一文件来允许两个不同的进程进行通信。但是,我对此有一些问题。我感觉这与我使用 open() 调用并将文件描述符传递给 mmap 的方式有关。
这是我的代码,你能看出它有什么问题吗?
对象 1 的代码:
16 FILE* temp = fopen(theSharedFileName, "w");
17 fseek(temp, fileSize-1, SEEK_SET);
18 fprintf(temp, "0"); // make the file a certain size
19 fseek(temp, 0, SEEK_CUR);
20
21 int sharedFileName = fileno(temp);
...
31 sharedArea = (MyStruct*)mmap(0, fileSize,
32 PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED, sharedFileName, 0);
我使用“w”文件模式,因为对象 1 只会生成一次,我希望它重置任何以前存在的数据。
对象 2 的代码:
130 FILE* tempFile = fopen(sharedFileName, "a");
131 int theFile = fileno(tempFile);
...
135 sharedArea = (MyStruct*)mmap(NULL, fileSize,
136 PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED, theFile, 0);
【问题讨论】:
-
您面临哪些具体问题?你能保证 obj2 永远不会在 obj1 之前访问该文件吗?
-
是的,obj1更像是一个服务器,而obj2更像是一个稍后会启动的客户端。