加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux文件操作学习:系统调用和标准I/O库

发布时间:2016-10-31 01:28:04 所属栏目:Linux 来源:网络整理
导读:一、什么是文件 在讲述文件操作之前,我们首先要知道什么是文件。看到这个问题你可能会感觉到可笑,因为对于用过计算机的人来说,文件是最简单不过的概念了,例
副标题[/!--empirenews.page--]

一、什么是文件

在讲述文件操作之前,我们首先要知道什么是文件。看到这个问题你可能会感觉到可笑,因为对于用过计算机的人来说,文件是最简单不过的概念了,例如一个文本是一个文件,一个work文档是一个文件等。但是在Linux中,文件的概念还远不止于这些,在Linux中,一切(或几乎一切)都是文件。文件包括很多的内容,例如:大家知道的普通文件是文件,目录也是一个文件,设备也是一个文件,管道也是一个文件等等。对于目录、设备这些的操作也可以完全等同于对纯文本文件的操作,这也是Linux非常成功的特性之一吧。

二、系统调用

1、文件描述符

文件描述符是一些小数值,你可以通过它们访问的打开的文件设备,而有多少文件描述符可用取决于系统的配置情况。但是当一个程序开始运行时,它一般会有3个已经打开的文件描述符,就是

0:标准输入

1:标准输出

2:标准错误

那些数学(即0、1、2)就是文件描述符,因为在Linux上一切都是文件,所以标准输入(stdin),标准输出(stdout)和标准错误(stderr)也可看作文件来对待。

2、系统调用常用函数

A、open系统调用

open函数的原型为:

int open(const char *path, int oflags);

int open(const char *path, int oflags, mode_t mode);

path,是包括路径的完整文件名,oflags是文件访问模式(即是什么方式打开文件,只读、只写还是可读并可写等),mode用于设定文件的访问权限。具体的可选参数,可以自己查看手册页,这里不一一详述。

open建立了一条到文件或设备的访问路径,如果调用成功,返回一个可以被read、write等其他系统调用的函数使用的文件描述符,而且这个文件描述是唯一的,不与任何其他运行中的进程共享,在失败时返回-1,并设置全局变量errno来指明失明的原因。

B、write系统调用

write函数的原型为:

size_t write(int fildes, const void *buf, size_t nbytes);

write的作用是把缓冲区buf的前nbytes个字节写入到文件描述符fildes关联的文件中,返回实际写入的字节数。返回0表示没有写入任何数据,返回-1表示调用中出现了错误,错误代码保存在errno中。

注:fildes一定要是在open调用中返回的创建的文件描述符,或者是0、1、2等标准输入、输出或标准错误。

C、read系统调用

read函数的原型为:

size_t read(int fildes, void *buf, size_t nbytes);

read系统调用的作用是从与文件描述符相关的文件里读入nbytes个字节的数据,并把它们放到数据区buf中,返回读入的字节数,失败时返回-1。

D、close系统调用

close调用的函数原型为:

int close(int fildes);

close函数的作用是终于文件描述符fildes一其对应的文件之间的关联。

E、例子

说了这么多,我就给出一个完整的例子吧,就是从一个数据文件(里面有1M个‘0’字符)逐个复制到别一个文件。文件名为copy_system.c,代码如下:

#include <unistd.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
#include <stdlib.h>  
      
int main()  
{  
    char c = '';  
    int in = -1, out = -1;  
          
    //以只读方式打开数据文件  
    in = open("Data.txt", O_RDONLY);  
    //以只写方式创建文件,如果文件不存在就创建一个新的文件  
    //文件属主具有读和写的权限  
    out = open("copy_system.out.txt", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);  
    while(read(in, &c, 1) == 1)//读一个字节的数据  
        write(out, &c, 1);//写一个字节的数据  
      
    //关闭文件描述符  
    close(in);  
    close(out);  
    return 0;  
}

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读