lseek sed fse prot 地址 stdio.h buffer pri
实现代码
- #include
- #include
- #include
- #include
- #include //perror()#include //exit()
- #defineBUFFER_SIZE 1024intmain(intargc,char*argv[])
- {
- int from_fd;
- int to_fd;
- unsigned int file_len;
- intret =1;
- char buf[BUFFER_SIZE];
- char*ptr;
- if(argc !=3)
- {
- printf("Usage:%s fromfile tofilen",argv[0]);
- exit(1);
- }
- //打开源文件from_fd = open(argv[1],O_RDONLY);
- if(from_fd == -1)
- {
- printf("open %s failed.n",argv[1]);
- exit(1);
- }
- //以只写的方式打开文件,没有的则创建文件to_fd = open(argv[2],O_WRONLY|O_CREAT|O_APPEND,0666);//使用0666
- if(to_fd == -1)
- {
- printf("open %s failed.n",argv[2]);
- exit(1);
- }
- //源文件的大小file_len =
- lseek(from_fd,0,SEEK_SET);//必须重新定位offsetprintf("%s size is %d bytes.n",argv[1],file_len);
- while(ret)
- {
- ret = read(from_fd,buf,BUFFER_SIZE);
- if(ret == -1)
- {
- perror("read Error.n");
- }
- write(to_fd,buf,ret);
- file_len -= ret;
- // bzero(buf,BUFFER_SIZE);
- }
- printf("There are %d bytes data left without copy in %sn",file_len,argv[1]);
- close(from_fd);
- close(to_fd);
- return 0;
- }
1. 注意权限必需使用 0666,最好是宏
2. 使用 mmap 操作更加高效
- #include
- #include
- #include
- #include
- #include
- #include
- intmain(void)
- {
- int len;
- //打开文件,以读写的方式打开
- int fd;
- fd = open("hello",O_RDWR);//hello 文件存在
- if(fd == -1)
- {
- perror("open");
- return-1;
- }
- len = lseek(fd,0L,SEEK_END);
- // lseek(fd,0,SEEK_SET);
- //将文件映射到进程的虚拟地址空间
- void*p = mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
- if(p==MAP_FAILED)
- {
- perror("mmap");
- return-1;
- }
- int*q = (int*)p;
- q[0] =0x20202020;
- q[1] =0x41414141;
- munmap(p,len);
- close(fd);
- }
使用 mmap 将物理内存映射到进程的虚拟地址空间 mmap(2) 系统调用,实现代码在内核,内核态 #include
Linux 系统函数 open,read,write
来源: http://www.bubuko.com/infodetail-2107572.html