linux open read 例子,Linux系统函数open,read,write

Linux系统函数open,read,write

lseek   sed   fse   prot   地址   stdio.h   buffer   pri

实现代码#include

#include

#include

#include

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

#defineBUFFER_SIZE 1024intmain(intargc,char*argv[])

{

intfrom_fd;

intto_fd;

unsignedintfile_len;

intret=1;

charbuf[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);

return0;

}

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

2. 使用 mmap 操作更加高效#include

#include

#include

#include

#include

#include

intmain(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 被设置

Linux 系统函数 open,read,write

来源: http://www.bubuko.com/infodetail-2107572.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值