linux系统io编程,Linux系统编程(1) —— 文件IO

 2023-09-08 阅读 24 评论 0

摘要:本文主要对Linux系统中文件I/O的基本操作进行说明。在Linux系统编程中,对文件进行处理的流程,通常是:打开文件shell程序设计、读写文件关闭文件Linux内核对每一个进程维护一个打开的文件列表, 该文件列表称为文件表(file table).linux epoll。而对

本文主要对Linux系统中文件I/O的基本操作进行说明。

在Linux系统编程中,对文件进行处理的流程,通常是:

打开文件

shell程序设计、读写文件

关闭文件

Linux内核对每一个进程维护一个打开的文件列表, 该文件列表称为

文件表(file table).

linux epoll。而对该文件表进行访问时,是通过一个整数进行索引,该整数索引称为

文件描述符(file descriptor,简称fds)

文件表中各个表项包含打开的文件的如下信息:

指针 -—— 指向文件备份索引节点在内存中的拷贝

LINUX系统?相关的元数据 —— 文件位置和访问模式

在用户空间和内核空间都使用文件描述符(fds)作为唯一的cookies

打开一个文件,返回一个文件描述符。在后续的操作中,比如读取文件,写文件等。都使用文件描述符作为入参来调用对应的操作函数。

文件描述符使用C语言中的int类型来表示。

linux异步io、Linux进程有一个打开最大文件个数的限制。 文件描述符从0开始,逐步增加直到最大的值。缺省情况下为1024, 可以配置最大为1048576.

负值通常认为是非法的文件描述符。-1通常表示返回的错误值。

注:

每个进程按惯例至少有三个文件描述符:0,1和2

linux查看io图形化。文件描述符0(fds 0):标准输入

文件描述符1(fds 1):标准输出

文件描述符2(fds 2):标准错误

不过进程可以显式的关闭它们。

shell程序,在C库中,定义了预处理宏:

SDTIN_FILENO, STDOUT_FILENO, STDERR_FILENO.

通常, stdin:连接终端的输入设备(通常用户键盘)

stdout和stderr:连接到终端的输出设备(通常显示屏)

vim 上一页下一页?不过通常也重定向这些标准文件描述符。以及通过pipe把一个程序的输出作为另一个程序的输入。

这些就是shell实现的重定向和管道(pipes)

缺省情况下,子进程获得父进程的文件表的拷贝, 即打开的文件列表,访问模式,当前文件位置和其他一些元数据都是一样的。

但是有一点区别, 子进程关闭一个文件,不影响其他进程的文件表。 这让子进程和父进程共享文件列表成为可能(例如thread)。

vim编程?打开文件

open()系统调用

#include

#include

linux 进程?#include

int open (const char *name, int flags);

int open (const char *name, int flags, mode_t mode);

open()的作用就把文件名(name)映射为一个文件描述符。

实现shell,const char *name: 文件名

int flag: 是按bit位进行或操作的。它必须包括一个访问模式(例如O_RDONLY, O_WRONLY或O_RDWR)

举例:

int fd;

fd = open ("/home/fantasy/text", O_RDONLY);

if (fd == −1)

/* error */

该段代码表示打开的文件,只能进行读取,不能进行写操作。

flag的取值,可从下表中获取进行bit位或操作

flga标志

作用

O_APPEND

追加模式

O_ASYNC

只能用于FIFO,管道,sockets和terminal,不能用于普通文件

O_CLOEXEC

O_CREAT

若文件不存在,将创建该文件,若文件已存在,这该表示无效除非指定了O_EXCL

O_DIRECT

O_DIRECTORY

O_EXCL

O_LARGEFILE

O_NOATIME+

O_NOCTTY

O_NOFOLLOW

O_NONBLOCK

O_SYNC

O_TRUNC

mode_t mode:

mode标志

作用

S_IRWXU

Owner has read, write, and execute permission

S_IRUSER

Owner has read permission

S_IWUSER

Owner has write permission

S_IXUSER

Owner has execute permission

S_IRWXG

Group has read, write, and execute permission

S_IRGRP

Group has read permission

S_IWGRP

Group has write permission

S_IXGRP

Group has execute permission

S_IRWXO

Everyone else has read, write, and execute permission

S_IROTH

Everyone else has read permission

S_IWOTH

Everyone else has write permission

S_IXOTH

Everyone else has execute permission

creat()函数

#include

#include

#include

int creat (const char *name, mode_t mode);

读取文件

read()系统调用

#include

ssize_t read (int fd, void *buf, size_t len);

从文件中读取len长度的字节到buf指向的内存空间中。该函数的返回值是写入buf中的字节数。若返回-1,表示read失败。

同时文件的读取位置向后移动读取的字节数。

写入文件

write系统调用

#include

ssize_t write (int fd, const void *buf, size_t count);

从buf中写count字节到文件的当前位置。

关闭文件

当程序完成了对文件的操作后,调用close()系统调用来关闭该文件

#include

int close (int fd);

close()取消打开的文件描述符fd的映射,并取消文件和进程的关联。

调用close()对,对应的描述符就不再有效。

close()返回0表示成功,返回-1表示错误。

if (close (fd) == −1)

perror ("close");

实例:

#include

#include

#include

#include

#include

#include

#define BUF_SIZE 1024

int main()

{

int from_fd;

int to_fd;

to_fd = open("/home/fantasy/test.txt", O_WRONLY | O_CREAT);

if (-1 == to_fd)

{

printf("open the file fail\n");

}

const char *buf = "write file!";

ssize_t nr;

nr = write(to_fd, buf, strlen(buf));

if (-1 == nr)

{

printf("write the file fail\n");

}

from_fd = open("/home/fantasy/test.txt", O_RDONLY);

if (-1 == from_fd)

{

printf("open the file fail\n");

}

char read_buf[BUF_SIZE];

nr = read(from_fd, read_buf, BUF_SIZE);

if (-1 == nr)

{

printf("read the file fail\n");

}

else

{

printf("readbuf = %s\n", read_buf);

}

close(to_fd);

close(from_fd);

}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/19527.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息