`

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

}

分享到:
评论

相关推荐

    Linux下的系统调用和进程

    ### Linux下的系统调用与进程深入解析 #### 系统调用:Linux核心与应用程序间的桥梁 系统调用是Linux操作系统中,用户空间的应用程序与内核之间进行交互的主要方式。它提供了应用程序能够请求内核服务的一系列接口...

    19——Linux的系统调用与文件IO(二)

    在Linux操作系统中,系统调用和文件I/O是核心概念,它们构成了程序与硬件交互的基础。本主题将深入探讨这两个重要领域,特别是针对"19——Linux的系统调用与文件IO(二)"这一视频教程内容进行详细阐述。 首先,让...

    LINUX的系统调用与函数调用.pdf

    在Linux操作系统中,系统调用和函数调用是两种不同的程序交互方式,它们各自有着独特的特性和应用场景。本文主要探讨了Linux系统调用和函数调用的区别以及它们在系统中的作用。 首先,系统调用是操作系统为应用程序...

    通过Linux系统调用对设备文件进行操作

    通过本篇文章,我们将深入探讨如何在Linux环境下利用系统调用对设备文件进行操作,并特别关注时间日期相关的设备文件处理方式。文章将从理论基础出发,介绍Linux设备文件的基本概念、系统调用机制以及如何通过ioctl...

    Linux常见系统调用列表介绍

    Linux 系统调用是操作系统提供给应用程序的接口,用于控制进程、文件系统、网络、设备等资源。以下是 Linux 系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的函数。 进程控制 * fork:创建一个...

    Linux系统调用

    系统调用是操作系统提供的一种服务,它允许用户程序安全地访问内核功能。通过系统调用,用户空间的程序可以执行只有操作系统才能完成的任务,如文件操作、进程管理、内存管理等。Linux系统调用是其内核服务的入口点...

    linux文件操作之系统调用

    例如 Windows 采用的系统调用的应用程序不能直接在 Linux 下编译运行。 之所以使用系统调用是因为系统资源的有限性以及内核管理的方便,系统调用将上层内的应用开发与底层的硬件实现分开,上层应用不需要关注底层...

    linux系统调用手册

    系统调用是操作系统提供给用户态程序访问内核功能的接口,允许用户程序执行如创建进程、读写文件、网络通信等任务。 在Linux中,每个系统调用都有一个预定义的编号,这个编号在`/usr/include/bits/syscall.h`文件中...

    Linux系统调用.pdf

    Linux系统调用是用户空间访问内核的唯一手段,它们是内核唯一的合法入口。通知内核的机制是通过软中断的机制实现的:通过引发一个异常来促使系统切换到内核态去执行异常处理程序。此时的异常处理程序实际上就是系统...

    Linux下通过系统调用(API)和C语言库函数对文件进行访问

    首先,让我们深入了解一下通过系统调用访问文件。系统调用是操作系统提供给用户程序直接访问硬件资源的接口,它们是操作系统内核的一部分。在Linux中,对文件进行操作的核心系统调用包括: 1. **创建文件**:`creat...

    linux内核知识系列:系统调用

    1. 系统调用定义:系统调用是操作系统提供给用户程序的一组预定义函数,它们在硬件保护模式下运行,具有访问所有系统资源的权限。用户程序通过系统调用进入内核态,执行特定的操作,然后返回到用户态。 2. 系统调用...

    实验(五)Linux系统调用的编程技术 - 副本.doc

    Linux系统调用是操作系统提供的一种核心服务方式,允许用户态的程序安全地访问操作系统功能。在Linux中,系统调用是通过软中断机制实现的,通常由特定的汇编指令如`int`触发。系统调用接口是API(应用程序编程接口)...

    linux系统调用可视化 操作系统课程设计 实验报告

    【操作系统课程设计——Linux系统调用可视化实验报告】 在操作系统的学习过程中,系统调用是连接用户空间和内核空间的重要桥梁。本实验旨在通过可视化Linux系统调用的过程,加深对系统调用的理解,同时锻炼动手实践...

    实验五Linux系统调用的编程技术

    Linux系统调用是操作系统提供的一种服务机制,允许用户态的程序安全地访问内核功能。在实验五“Linux系统调用的编程技术”中,主要目标是理解和掌握系统调用的工作原理,包括如何通过API调用系统服务以及参数传递的...

    Linux 系统调用权威指南

    本文将深入探讨系统调用的基本概念、工作原理及其在不同场景下的实现方式。 #### 二、什么是系统调用? 系统调用是指用户态的应用程序通过特定的机制向内核请求服务的过程。简单来说,当一个程序需要执行某种只能...

    Linux2.4添加系统调用

    在Linux操作系统中,系统调用是用户空间与内核空间之间进行通信的重要接口,它允许应用程序请求操作系统执行特定的功能,如文件操作、进程控制、内存管理等。在本实验中,我们将探讨如何在Linux 2.4内核版本中添加一...

    Linux 系统函数调用大全

    本资源集合了 Linux 系统函数调用的多个关键领域,包括进程操作、文件权限控制、接口处理、用户组管理、文件操作、信号处理、内存及字符串操作、文件内容操作和内存控制,以及数据结构与算法的应用。 首先,进程...

    Linux下系统调用原理解析及增加系统调用的方法[整理].pdf

    系统调用是 Linux 系统中最基本的组成部分,它提供了应用程序与操作系统之间的接口,使得应用程序可以访问硬件资源、管理进程、管理文件系统等。同时,系统调用也为开发者提供了创造性的空间,允许他们开发出更加...

Global site tag (gtag.js) - Google Analytics