`

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

}

分享到:
评论

相关推荐

    基于Springboot的实验报告系统源码数据库文档.zip

    基于Springboot的实验报告系统源码数据库文档.zip

    ERA5_Climate_Single_Month.txt

    GEE训练教程——Landsat5、8和Sentinel-2、DEM和各2哦想指数下载

    基于springboot智能健康饮食系统源码数据库文档.zip

    基于springboot智能健康饮食系统源码数据库文档.zip

    基于SpringBoot的校园服务系统源码数据库文档.zip

    基于SpringBoot的校园服务系统源码数据库文档.zip

    史上最全IXIA测试仪配置使用指导手册(含IxNetwork,图文并茂超详细!).zip

    内容概要: IXIA测试仪的基本配置.doc ixia测试仪基础使用示例.doc IxNetwork如何进行抓包回放-V1.0.pdf IxNetwork如何自定义报文-V2.0.pdf ixia构造ip分片方法.txt IxNetwork使用简介.pdf 适用人群:网络协议造包、打流相关的测试工程技术人员,想要学习的同学可以下载哈 使用场景:构造pcap包,打流 Ixia简介 IXIA使用的是Server-client模式,Server端在测试仪表的主机上,在开机后会随着主机内的操作系统的启动而自动启动,一般情况下不需要人为的手工启动。因此在通常不需要为主机配置专用的显示器和键盘。 client端包括两个测试软件: Ixia Explorer和ScriptMate。这两个软件一般安装在测试用计算机上,在仪表自带的主机中也有这两个软件。根据测试项目的不同来选择使用不同的软件。Ixia Explorer主要提供数据流的测试,针对设备的功能进行测试; ScriptMate提供各种性能测试窗口,针对设备的性能进行测试。 Auto:自动分配;

    基于Python+Django花卉商城系统源码数据库文档.zip

    基于Python+Django花卉商城系统源码数据库文档.zip

    Umi-OCR-main.zip

    Umi-OCR-main.zip

    微信小程序源码-促销抽奖.zip

    基于微信小程序开发的促销抽奖小工具源码,适用于初学者了解小程序开发过程以及简单抽奖工具的实现。

    Sen2_median.txt

    GEE训练教程——Landsat5、8和Sentinel-2、DEM和各2哦想指数下载

    springboot的概要介绍与分析

    以下是一个关于Spring Boot设计的资源描述及项目源码的简要概述: Spring Boot设计资源描述 Spring Boot是一个为基于Spring的应用提供快速开发工具的框架,其设计旨在简化Spring应用的初始搭建和开发过程。以下是一些关键资源: Spring Boot官方文档:详细阐述了Spring Boot的核心特性、自动配置原理、起步依赖、内嵌式服务器等关键概念。这是学习和掌握Spring Boot设计的首选资源。 在线教程与视频:各大在线教育平台提供了丰富的Spring Boot教程和视频课程,从基础入门到高级应用,帮助开发者全面了解和掌握Spring Boot设计。 书籍与电子资料:许多技术书籍和在线电子资料深入讲解了Spring Boot的设计原理、最佳实践和项目案例,为开发者提供了宝贵的学习资源。 项目源码示例 以下是一个简单的Spring Boot项目源码示例,用于演示Spring Boot的基本结构和自动配置功能: java // 引入Spring Boot依赖 @SpringBootApplication public class MySpri

    基于springboot美妆领域管理系统源码数据库文档.zip

    基于springboot美妆领域管理系统源码数据库文档.zip

    tables-3.7.0+gpl-cp37-cp37m-win_amd64.whl

    tables-3.7.0+gpl-cp37-cp37m-win_amd64.whl

    算法实现的概要介绍与分析

    算法是计算机科学的核心,它们在解决各种问题时发挥着关键作用。一个好的算法不仅可以提高程序的效率,还可以简化复杂的问题。下面我将通过一个具体的例子——快速排序算法(Quick Sort)——来展示算法的实现过程,包括资源描述和项目源码。 ### 快速排序算法简介 快速排序是一种高效的排序算法,采用分治法的思想。其基本步骤如下: 1. 从数列中挑出一个元素,称为“基准”(pivot)。 2. 重新排序数列,所有比基准值小的元素放到基准前面,所有比基准值大的元素放到基准后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。 3. 递归地(recursive)把小于基准值的子数列和大于基准值的子数列排序。 ### 资源描述 快速排序算法因其高效性和简洁性,在实际应用中非常受欢迎。它的时间复杂度平均为 O(n log n),最坏情况下为 O(n^2),但这种情况很少发生。快速排序的空间复杂度为 O(log n),因为它使用了递归来实现。 快速排序的一个典型应用场景是在数据库系统中对大量数据进行排序。由于它的高效性,快速排序

    基于springboot农场投入品运营线上管理系统源码数据库文档.zip

    基于springboot农场投入品运营线上管理系统源码数据库文档.zip

    基于springboot个性化影院推荐系统源码数据库文档.zip

    基于springboot个性化影院推荐系统源码数据库文档.zip

    linux基础进阶笔记

    linux基础进阶笔记,配套视频:https://www.bilibili.com/list/474327672?sid=4493093&spm_id_from=333.999.0.0&desc=1

    微信自动抢红包动态库.zip程序资源学习资料参考

    小程序 微信自动抢红包动态库.zip程序资源学习资料参考

    iOS版微信抢红包插件(支持后台抢红包).zip

    小程序 iOS版微信抢红包插件(支持后台抢红包).zip

    经典-FPGA时序约束教程

    经典-FPGA时序约束教程

    基于springboot的智慧点餐系统源码数据库文档.zip

    基于springboot的智慧点餐系统源码数据库文档.zip

Global site tag (gtag.js) - Google Analytics