Linux下系统调用访问文件

Linux的文件操作有两种方式:

Linux系统调用方式,这种方式依赖于Linux系统

C语言的文件操作,采用C语言的库函数实现。

以下是Linux系统调用方式:

 

1. 创建文件

int creat(const char *filename, mode_t mode)

filename:要创建的文件名,包含路径,缺省时为当前路径;

mode:创建模式

常见创建模式:

S_IRUSR             可读            4直接用数字来表示文件的访问权限

S_IWUSR             可写            2

S_IXUSR             可执行          1

S_IRWXU             可读、写、执行  7

 

实例如下:

#include <stdio.h>

#include <stdlib.h>

 

#include <sys/types.h>

#include <sys/stat.h>  

#include <fcntl.h>    

 

void  create_file(char *filename){

 

    

    if(creat(filename,0755)<0){      //指定创建的文件具有地属性

        printf("create file %s failure!/n",filename);

        exit(EXIT_FAILURE);

    }else{

        printf("create file %s success!/n",filename);

    }

}

 

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

    int i;

    if(argc<2){

        perror("you haven't input the filename,please try again!/n");

        exit(EXIT_FAILURE);

    }

 

    for(i=1;i<argc;i++){          //可以创建多个文件

        create_file(argv[i]);   

    }

 

    exit(EXIT_SUCCESS);

}

注意:代码中的系统头文件都在/usr/include目录下,这个目录是gcc定义的系统目录

 

访问权限

每一个文件或是目录的访问权限都有三组,每组用三位表示,分别为文件所有者的读、写和执行权限;与所有者同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls  -l 命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。

例如:$ ls –l sobcrc.tgz

-rw-r--r-- 1 root root 483997 Jul 15 17:31 sobcrc.tgz

注意这里共有10个位置。第一个字符指定了文件类型,如果第一个字符是横线,表示是一个非目录的普通文件,如果是d,表示是一个目录。r代表只读,w代表写,x代表可执行,横线代表无该项权限。

 

2. 打开文件和关闭文件

文件描述

Linux系统中,所有打开的文件都对应一个文件描述符。文件描述符的本质是一个非负整数。当打开一个文件时,该整数由系统来分配。文件描述符的范围是0~OPEN_MAX

int open(const char *pathname, int flags)

int open(const char*pathname, int flags, mode_t mode)

pathname:为要打开文件的路径名,缺省值为当前路径

flags:当前标志

有:O_RDONLY(只读方式打开), O_WRONLY(这写方式打开), O_RDWR(读写方式打开), O_APPEND(追加方式打开), O_CREAT(创建一个文件), O_NOBLOCK(非阻塞方式打开)

注意:只有使用O_CREAT标志时,才使用int open(const char*pathname, int flags, mode_t mode)

这时,mode指定创建文件的权限。

int close(int fd) 用于关闭打开的文件,其中fd是已经打开的文件描述符。

 

例子如下:

#include <stdio.h>

#include <stdlib.h>

 

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

 

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

    int fd;

    if(argc<2){

        puts("please input the open file pathname!/n");

        exit(1);

    }

   

    //如果flag参数里有O_CREAT表示,该文件如果不存在,系统则会创建该文件,该文件的权限由第三个参数决定,此处为0755

    //如果flah参数里没有O_CREAT参数,则第三个参数不起作用.此时,如果要打开的文件不存在,则会报错.

    //所以fd=open(argv[1],O_RDWR),仅仅只是打开指定文件

    if((fd=open(argv[1],O_CREAT|O_RDWR,0755))<0){

        perror("open file failure!/n");

        exit(1);

    }else{

        printf("open file %d  success!/n",fd);

 

    }

    close(fd);

    exit(0);

}

 

3.系统调用实现文件的拷贝(综合使用)

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

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

 

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

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

 

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

功能:将文件读写的指针相对于whence移动offset个字节(可为负值,表示向前移动)。操作成功后,返回文件指针相对于头文件的位置。

    Whence可使用下述值:

SEEK_SET:相对文件开头

SEEK_CUR:相对文件读写指针的当前位置

SEEK_END:相对文件末尾

 

int access(const char *pathname, int mode)

pathname:文件名称

mode:要判断的访问权限。可以取以下值或者是它们的组合。

R_OK:文件可读,W_OK:文件可写;

X_OK:文件可执行,F_OK:文件可存在。

返回值:测试成功,返回值为0,否则为-1

 

示例如下:

#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((to_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);

}

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值