linux 系统函数 open,Linux系统函数open,read,write(示例代码)

实现代码

#include#include#include#include#include //perror()

#include //exit()

#define BUFFER_SIZE 1024

int main(int argc,char *argv[])

{intfrom_fd;intto_fd;

unsignedintfile_len;int ret = 1;charbuf[BUFFER_SIZE];char *ptr;if(argc != 3)

{

printf("Usage:%s fromfile tofile\n",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); //必须重新定位offset

printf("%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 %s\n",file_len,argv[1]);

close(from_fd);

close(to_fd);return 0;

}

1.注意权限必需使用0666,最好是宏

2.使用mmap操作更加高效

#include#include#include#include#include#include

int main(void)

{intlen;//打开文件,以读写的方式打开

intfd;

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

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

将文件和设备映射到进程的虚拟地址空间

Linux下一切皆文件

参数:

addr: 它指定了开始地址,在进程的虚拟地址空间里,取值为NULL,由内核决定具体的地址

length:指定了映射的区域的长度

prot:

PROT_EXEC  Pages may be executed.

PROT_READ  Pages may be read.

PROT_WRITE Pages may be written.

PROT_NONE  Pages may not be accessed.

flags:

MAP_SHARED Share this mapping. 对映射区域的更改反映到其他进程里,同步到underlying底层文件

MAP_PRIVATE Create a private copy-on-write mapping. 对于映射区域的映射不反映到其他进程里,不同步到文件,除非msync

MAP_ANONYMOUS 匿名映射,和文件无关,映射的区域全部清为0

fd:         -1

offset:文件的偏移   0

返回值:

正确:隐射区域首地址

错误:MAP_FAILED (void*)-1 errno 被设置

int munmap(void *addr, size_t length);

解除映射

addr: mmap()的返回值

length:指定了解除映射区域的长度

返回值:成功为0,错误为-1,errno被设置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值