Linux系统函数open,read,write

实现代码

#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>        //perror()
#include<stdlib.h>        //exit()

#define BUFFER_SIZE 1024

int main(int argc,char *argv[])
{
    int from_fd;
    int to_fd;
    unsigned int file_len;
    int ret = 1;
    char buf[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<sys/mman.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(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 <sys/mman.h>
        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被设置

时间: 2024-10-12 13:51:49

Linux系统函数open,read,write的相关文章

linux 系统函数之 (dirname, basename)【转】

转自:http://blog.csdn.net/peter_cloud/article/details/9308333 版权声明:本文为博主原创文章,未经博主允许不得转载. 除非你的原件考虑跨平台. 在Linux编程多使用一些系统函数真的很方便,哎没办法越来越懒~~~~~~ 今天记录一下dirname 和basename这两个简单的处理文件路径的linux系统函数. 头文件: #include <libgen.h> 函数定义: char *dirname(char *path); char *

利用Linux系统函数alarm() 来检测计算机性能

大家都知道,alarm() 是Linux系统自带的定时函数,操作系统管理进程时为每个进程分配了一个定时器,下面利用1秒钟定时,看计算机能计数多少来判断计算机的性能: #include<stdio.h> #include<unistd.h> int main() { int counter; alarm(1); for(counter=0;1;counter++) printf("counter=%d",counter); return 0; } 我的计算机测得是

linux 系统函数 basename和dirname

在linux系统中有这样两个系统函数,basename 和  dirname 1.basename 用于 获取文件名, 1.1 当给定扩展名作为参数之后,甚至可以直接获取文件名 2.与basename 相对应的 dirname 就是获取文件的路径,哈哈: linux 真是一个神奇的的系统. 原文地址:https://www.cnblogs.com/SliverLee/p/11441140.html

Linux系统函数read()/write()/pread()/pwrite()的区别-(转自CSDN网络)

在Linux和UNIX中有很多的输入输出函数,有时真是让想跟它攀点关系的菜鸟们束手无策.先来看看都有哪些函数,通过解析与总结,看看能不能让大家能这些函数有个理性的认识,哦,原来是这么回事,也就算我没白花这份闲. 内核文件I/O->标准库I/O->高级I/O->IPC中 1.         read()/write(); 2.         pread()/pwrite(); 3.         getc()/putc(); 4.         fgetc()/fputc(); 5

标准c库函数与Linux下系统函数库 区别 (即带不带缓冲区的学习)

我们都知道,C语言在UNIX/Linux系统下有一套系统调用(系统函数),比如文件操作open().close().write().read()等,而标准C语言的库函数中也有一套对文件的操作函数fopen().fclose().fwrite().fread()等..那么同样是对文件的操作函数,标C与UC有什么区别呢?是标C效率高还是UC效率高呢?今天就让我们来一探究竟. 程序作用:将0~999999这1000000个整型数据写入文件. 1.标准C实现大量数据写入文件: /*文件名test1.c*

linux系统下信号具体解释2

信号是UNIX 系统所使用的进程通信方法中,最古老的一种.信号不但能从内核发往一个进程,也能从一个进程发往还有一个进程.比如,用户在后台启动了一个要运行较长时间的程序,假设想中断其运行,能够用kill 命令把SIGTERM信号发送给这个进程,SIGTERM 将终止此进程的运行.信号还提供了向UNIX 系统进程传送软中断的简单方法.信号能够中断一个进程,而无论它正在作什么工作.因为信号的特点,所以不用它来作进程间的直接数据传送,而把它用作对非正常情况的处理.因为信号本身不能直接携带信息,这就限制了

linux系统下信号详解2

信号是UNIX 系统所使用的进程通信方法中,最古老的一种.信号不但能从内核发往一个进程,也能从一个进程发往另一个进程.例如,用户在后台启动了一个要运行较长时间的程序,如果想中断其执行,可以用kill 命令把SIGTERM信号发送给这个进程,SIGTERM 将终止此进程的执行.信号还提供了向UNIX 系统进程传送软中断的简单方法.信号可以中断一个进程,而不管它正在作什么工作.由于信号的特点,所以不用它来作进程间的直接数据传送,而把它用作对非正常情况的处理.由于信号本身不能直接携带信息,这就限制了它

【Linux程序设计】之环境系统函数综合实验

这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的.贴出来纯粹是聊胜于无. 实验题目:Linux环境下系统函数综合实验 实验目的:熟悉并掌握Linux环境下数学函数.字符函数.系统时间与日期函数.环境控制函数.内存分配函数以及数据结构中常用函数的使用方法. 一.Linux环境下数学函数的使用 设计程序,满足如下要求: 1.使用rand函数产生10个介于1到10之间的随机数值.要求在程序中对每行代码添加注释. 1 #include<stdio.h> 2 #i

Linux系统编程-setitimer函数

功能:linux系统编程中,setitimer是一个经常被使用的函数,可用来实现延时和定时的功能. 头文件:sys/time.h 函数原型: int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); 参数含义: 1.which参数用来设置定时器类型,可选的值为 (1)ITIMER_REAL : 设置定时器以系统真实所花费的时间来计时,运行指定时间后发送SIGALRM信号. (