当前位置: 技术问答>linux和unix
关于IO 映射的一个问题,请各位指点一下,谢谢!
来源: 互联网 发布时间:2016-05-30
本文导语: 我按照UNIX高级编程上关于IO映射那一节写了一个类似的程序,先把一个文件(文件1)映射到内存,再创建一个新文件(文件2),并且也映射进来,然后在他们之间做一些复制的操作。 可是我创建文件2的时候,想把...
我按照UNIX高级编程上关于IO映射那一节写了一个类似的程序,先把一个文件(文件1)映射到内存,再创建一个新文件(文件2),并且也映射进来,然后在他们之间做一些复制的操作。
可是我创建文件2的时候,想把它的大小设置成和文件1一样大,采用的方法是调用lseek,把偏移量设置成文件1的长度减1,然后在那个位置写一个字节,问题就出在这里,当我write的时候,系统报错:segmentation fault,我找了很久的原因,可还是没发现错在哪?这个应该是很简单的错误弄的我茶饭不思,望各位高手为小弟解答一下问题所在!感激不禁!!
代码如下:
#include
#include
#include
#include
#include
#include
#include
#define FILE_MODE (S_IRUSR|S_IWUSR|S_IROTH|S_IWOTH)
int main(){
int fd_in,fd_out;
struct stat statbuf;
char *p_in,*tmp_in,*p_out,*tmp_out;
fd_in=open("/share/in.xml",O_RDONLY);
fstat(fd_in,&statbuf);
p_in=(char*)mmap(0,statbuf.st_size,PROT_READ,MAP_SHARED,fd_in,0);
fd_out=open("/share/out.xml",O_RDWR|O_CREAT,FILE_MODE);
lseek(fd_out,statbuf.st_size-1,SEEK_SET);
write(fd_out,"",1) *************************************************************执行到write()这里就出错了:segmentation fault ,
p_out=(char*)mmap(0,statbuf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd_out,0);
。。。。。。。。。。。。。。以下略
万望各位指教问题出在何处!!谢谢
可是我创建文件2的时候,想把它的大小设置成和文件1一样大,采用的方法是调用lseek,把偏移量设置成文件1的长度减1,然后在那个位置写一个字节,问题就出在这里,当我write的时候,系统报错:segmentation fault,我找了很久的原因,可还是没发现错在哪?这个应该是很简单的错误弄的我茶饭不思,望各位高手为小弟解答一下问题所在!感激不禁!!
代码如下:
#include
#include
#include
#include
#include
#include
#include
#define FILE_MODE (S_IRUSR|S_IWUSR|S_IROTH|S_IWOTH)
int main(){
int fd_in,fd_out;
struct stat statbuf;
char *p_in,*tmp_in,*p_out,*tmp_out;
fd_in=open("/share/in.xml",O_RDONLY);
fstat(fd_in,&statbuf);
p_in=(char*)mmap(0,statbuf.st_size,PROT_READ,MAP_SHARED,fd_in,0);
fd_out=open("/share/out.xml",O_RDWR|O_CREAT,FILE_MODE);
lseek(fd_out,statbuf.st_size-1,SEEK_SET);
write(fd_out,"",1) *************************************************************执行到write()这里就出错了:segmentation fault ,
p_out=(char*)mmap(0,statbuf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd_out,0);
。。。。。。。。。。。。。。以下略
万望各位指教问题出在何处!!谢谢
|
lseek到文件本身不存在的位置了吧.
你新建一个空文件,应该先扩展文件大小先.
这里只看到你新建,然后就lseek了.
你新建一个空文件,应该先扩展文件大小先.
这里只看到你新建,然后就lseek了.