嵌入式Linux应用开发---Linux文件编程

  1. 系统调用-文件访问

  2. 库函数-文件访问

  3. 时间编程

 

Linux中文件编程可以使用两种方法:

Linux系统调用

C/C++语言库函数

前者依赖于Linux系统,后者与操作系统是独立的,在任何操作系统下,使用C语言库函数操作文件的方法都是相同的。

 

系统调用-创建

int creat(const char *filename, mode_t mode)

  • filename:要创建的文件名(包含路径,缺省为当前路径)
  • mode:创建模式

常见的创建模式:

  • S_IRUSR   可读
  • S_IWUSR  可写
  • S_IXUSR   可执行
  • S_IRWXU   可读、可写、可执行

除了可以使用上述宏以外,还可以直接使用数字来表示文件的访问权限

  • 可执行 ->1
  • 可写 ->2
  • 可读 ->4
  • 上述值的和,如可写可读 ->6
  • 无任何权限 ->10

file_create.c

gcc file_create.c -o file_create

./file_create hello

create file hello success!

 

在Linux系统中,所有打开的文件都对应一个文件描述符文件描述符的本质是一个非负整数

当打开一个文件时,该整数由系统来分配。文件描述符的范围是0~OPEN_MAX

早期的UNIX版本OPEN_MAX=19,即允许每个进程同时打开20个文件,现在很多系统则将其增加至1024。


系统调用-打开

int open(const char *pathname, int flags)
int open(const char *pathname, int flags, mode_t mode)
  • pathname:要打开的文件名(包含路径,缺省为当前路径)
  • flags:打开标志

 

系统调用-关闭

当我们操作完文件以后,需要关闭文件: int close(int fd)

fd: 文件描述符(当我们使用open函数打开一个文件时,它会返回一个int 这个就是文件描述符fd)

系统调用-读

int read(int fd, const void *buf, size_t length)

功能:从文件描述符fd所指定的文件中读取length个字节到部分所指向的缓冲区中,返回值为实际读取的字节数。

系统调用-写

int write(int fd, const void *buf, size_t length)

功能:length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。

系统调用-定位

int lseek(int fd, offset_t offset, int whence)

功能:将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对文件头的位置。

如何利用lseek来计算文件长度

#include <unistd.h>
int main()
{
    if(access("/etc/passwd",R_OK)==0)        #判断passwd这个文件是否是一个可读的文件
        printf("/etc/passwd can be read!\n")
}

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>

#define BUFFER_SIZE 1024
int main(int argc, char **argv)
{
    int from_fd,to_fd;
    int bytes_read,bytes_write;
    char buffer[BUFFER_SIZE];
    char *ptr;
    
    if(argc!=3)
    {
       fprintf(stderr,"Usage:%s fromfile tofile /n/a",argv[0]);
       exit(1);
    }

/*打开源文件*/
    if((from_fd = open(argv[1],O_RDONLY)) == -1)
    {
       fprintf(stderr,"Open:%s Error:%s/n",argv[1],strerror(errno));
       exit(1);
    }


/*创建目的文件*/
    if((from_fd = open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)) == -1)
    {
       fprintf(stderr,"Open:%s Error:%s/n", argv[2],strerror(errno));
       exit(1);
    }

/*以下代码是一个金典的拷贝文件代码*/
    while(bytes_read = read(from_fd, buffer, BUFFER_SIZE))
    {
        /*如果一个致命错误发生*/
        if((bytes_read == -1)&&(errno != EINTR)) break;
        else if(bytes_read > 0)
        {
           ptr = buffer;
           while(bytes_write = write(to_fd, ptr, bytes_read))
           {
               /*如果一个致命错误发生*/
               if((bytes_write == -1)&& (errno != EINTR)) break;
                /*写完了所有都的字节*/
               else if(bytes_write == bytes_read) break;
                /*写了一部分继续写*/
               else if(bytes_write > 0)
               {
                  ptr += bytes_write;
                  bytes_read -= bytes_write;
               }
            }
            /*如果写时发生了一个致命错误*/
            if(bytes_write == -1)  break;
         }
    }

    close(from_fd);
    close(to_fd);
    exit(0);
}

vi s1     创建一个s1文件

./file_cp s1 s2    拷贝s1文件

 


库函数-文件访问

 

时间编程

 

计算一个函数使用的时间

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aFakeProgramer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值