Chinaunix

标题: 如何将一段内存映射为一个文件,然后得到FILE *指针,访问? [打印本页]

作者: ehuangmy    时间: 2006-11-07 00:26
标题: 如何将一段内存映射为一个文件,然后得到FILE *指针,访问?
如何将一段内存映射为一个文件,然后得到FILE *指针,用这个指针去访问内存,就像访问普通文件一样,但又不需要文件系统??
作者: naker    时间: 2006-11-07 01:21
楼主是想进程间通信吗,可不可以考虑用共有内存
作者: longshort    时间: 2006-11-07 07:56
楼主是要做嵌入式应用么?没看懂...
作者: bierdaci    时间: 2006-11-07 11:06
原帖由 ehuangmy 于 2006-11-7 00:26 发表
如何将一段内存映射为一个文件,然后得到FILE *指针,用这个指针去访问内存,就像访问普通文件一样,但又不需要文件系统??


文件就是以文件系统为基础存在的,对文件的所有操作都是基于文件系统这个机制进行的,不需要文件系统怎么会存在文件呢?
作者: gangjh    时间: 2006-11-07 11:27
在linux中有這麼一個函數,

  1.      FILE *fmemopen(void *buf, size_t size, const char *mode);
复制代码

作者: albcamus    时间: 2006-11-07 12:42
打开/dev/mem, mmap一下
作者: ehuangmy    时间: 2006-11-07 12:51
多谢各位,
请问 albcamus ,你说的用mmap如何映射呢?
     gangjh ,不知道unix上面有没有这个函数,这正是我需要的,我先去确认一下,多谢
作者: ehuangmy    时间: 2006-11-07 13:05
FILE *fmemopen(void *buf, size_t size, const char *mode);

这个是标准库函数,问题解决了,
太谢谢各位了,尤其是gangjh,谢谢
作者: chzht001    时间: 2006-11-07 14:31
原帖由 ehuangmy 于 2006-11-7 13:05 发表
FILE *fmemopen(void *buf, size_t size, const char *mode);

这个是标准库函数,问题解决了,
太谢谢各位了,尤其是gangjh,谢谢


标准库函数?
我的系统就没有哎!
作者: linternt    时间: 2006-11-07 15:46
原帖由 chzht001 于 2006-11-7 14:31 发表


标准库函数?
我的系统就没有哎!


我的也没有
作者: mike_chen    时间: 2006-11-07 15:51

  1.        This function is GNU extensions.
复制代码

作者: delta3k    时间: 2006-11-07 16:35
标题: 文件的HANDLE转化为FILE*
以前有人问过:"文件的HANDLE如何转化为FILE*"
当时留意了一下

要先include <io.h>
然后
FILE*   xxxx(HANDLE   hFile)   
{   
int   nHandle   =   _open_osfhandle((intptr_t)hFile,   _O_TEXT);   
if   (nHandle   !=   -1)   
return   _fdopen(nHandle,   szMode);   
else   
return   NULL;   
}
作者: langue    时间: 2006-11-07 21:13
呃,楼主能否反过来考虑一下。先把这部分内存的内容写入一个文件,然后 mmap,用新得到的内存指针访问,同时用文件系统也可访问到
作者: ehuangmy    时间: 2006-11-08 00:10
原帖由 langue 于 2006-11-7 21:13 发表
呃,楼主能否反过来考虑一下。先把这部分内存的内容写入一个文件,然后 mmap,用新得到的内存指针访问,同时用文件系统也可访问到

我的程序要求必须不能写入文件系统,必须在内存获取FILE*指针

所以这个方法不可行
作者: ehuangmy    时间: 2006-11-08 00:15
我做测试的系统前面已经有人安装了 fmemopen库,所以有
fmemopen是GNU libc 的,
在其他系统上无法编译,

所以想知道,有没有其他的方法实现这一点
作者: langue    时间: 2006-11-08 13:01
另外,能否把 glibc 里这个 fmemopen() 实现加入你的代码树,并且用条件编译,检测到是 GNU libc 并且启用了 fmemopen() 函数,就隐去函数的实现,否则编译进二进制代码
作者: windwiny    时间: 2006-11-08 14:50
原帖由 langue 于 2006-11-8 13:01 发表
另外,能否把 glibc 里这个 fmemopen() 实现加入你的代码树,并且用条件编译,检测到是 GNU libc 并且启用了 fmemopen() 函数,就隐去函数的实现,否则编译进二进制代码



你的应用要是以 GNU 发布的就行,,否则有 "道德"和"法律" 上的问题
作者: isnowran    时间: 2006-11-08 15:06
原帖由 ehuangmy 于 2006-11-8 00:15 发表
我做测试的系统前面已经有人安装了 fmemopen库,所以有
fmemopen是GNU libc 的,
在其他系统上无法编译,

所以想知道,有没有其他的方法实现这一点

tmpfile
作者: gangjh    时间: 2006-11-08 16:43
曾經想過將這個函數抓出來,
可Windows,和Linux的差異讓我沒有成功
樓主可自己實現一個
下面代碼是從libc的實現中抓出來的,訣竅就在這里吧

  1. FILE *
  2. fmemopen (void *buf, size_t len, const char *mode)
  3. {
  4.   cookie_io_functions_t iof;
  5. ..
  6. ..
  7.   iof.read = fmemopen_read;
  8.   iof.write = fmemopen_write;
  9.   iof.seek  = fmemopen_seek;
  10.   iof.close = fmemopen_close;
  11.   return _IO_fopencookie (c, mode, iof);
复制代码

作者: sithui    时间: 2006-11-08 17:06
呵呵,做嵌入式的应该知道scull,它就是用一段内存模拟成一个字符设备,可以对它像操作普通字符设备一样write,read等
作者: sithui    时间: 2006-11-08 17:07
不过用这个方法要在内核中加入一个模块,如果你没有root权限的话就做不到了
不过还是很有参考价值的,你可以去看看《linux device driver》这本书
作者: ehuangmy    时间: 2006-11-10 19:34
谢谢各位




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2