当前位置: 首页 > news >正文

手机房产网站模板360收录提交入口网址

手机房产网站模板,360收录提交入口网址,做本地的分类信息网站,计算机包含哪些专业在 Linux 中,文件 I/O 是指通过系统调用或命令对文件进行的输入输出操作。Linux 操作系统提供了强大的文件操作功能,使得用户和程序可以方便地对文件进行读取、写入、修改和管理。文件 I/O 指的是对文 件的输入/输出操作,说白了就是对文件的读…

        在 Linux 中,文件 I/O 是指通过系统调用或命令对文件进行的输入输出操作。Linux 操作系统提供了强大的文件操作功能,使得用户和程序可以方便地对文件进行读取、写入、修改和管理。文件 I/O 指的是对文 件的输入/输出操作,说白了就是对文件的读写操作;Linux 下一切皆文件,文件作为 Linux 系统设计思想的核心理念,在 Linux 系统下显得尤为重要,所以对文件的 I/O 操作既是基础也是最重要的部分。

        本章先向大家介绍 Linux 系统下文件描述符的概念,随后会逐一讲解构成通用 I/O 模型的系统调用,譬 如打开文件、关闭文件、从文件中读取数据和向文件中写入数据以及这些系统调用涉及的参数等内容。

本章将会讨论如下主题内容。

文件描述符的概念;

打开文件 open()、关闭文件 close()

写文件 write()、读文件 read()

文件读写位置偏移量。

一、文件IO示例

我们先来看一个简单地文件读 写示例,主要涉及到 4 个函数:open()read()write()以及 close(),应用程序代码如下所示:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{char buff[1024];int fd1, fd2;int ret;/* 打开源文件 src_file(只读方式) */fd1 = open("./src_file", O_RDONLY);if (-1 == fd1)return fd1;/* 打开目标文件 dest_file(只写方式) */fd2 = open("./dest_file", O_WRONLY);if (-1 == fd2) {ret = fd2;goto out1;}/* 读取源文件 1KB 数据到 buff 中 */ret = read(fd1, buff, sizeof(buff));if (-1 == ret)goto out2;/* 将 buff 中的数据写入目标文件 */ret = write(fd2, buff, sizeof(buff));if (-1 == ret)goto out2;ret = 0;
out2:/* 关闭目标文件 */close(fd2);
out1:/* 关闭源文件 */close(fd1);return ret;
}

这段代码非常简单明了,代码所要实现的功能在注释当中已经描述得很清楚了,从源文件 src_file 中读 取 1KB 数据,然后将其写入到目标文件 dest_file 中(这里假设当前目录下这两个文件都是存在的);在进 行读写操作之前,首先调用 open 函数将源文件和目标文件打开,成功打开之后再调用 read 函数从源文件中 读取 1KB 数据,然后再调用 write 函数将这 1KB 数据写入到目标文件中,至此,文件读写操作就完成了, 读写操作完成之后,最后调用 close 函数关闭源文件和目标文件。

        接下来我们给大家详细介绍这些函数以及相关的内容。

二、文件描述符(File Descriptor)

        在 Linux 中,所有的文件操作都是通过文件描述符(file descriptor)来进行的。文件描述符是一个非负整数,它指向内核中的文件表项。每当你打开一个文件时,操作系统会返回一个文件描述符。

  • 标准输入(stdin):文件描述符 0

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

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

        对于普通文件,当你通过 open() 系统调用打开文件时,会返回一个文件描述符。程序可以通过这个描述符来读写文件。

        调用 open 函数会有一个返回值,譬如示例代码 2.1.1 中的 fd1 fd2,这是一个 int 类型的数据,在 open 函数执行成功的情况下,会返回一个非负整数,该返回值就是一个文件描述符(file descriptor),这说明文 件描述符是一个非负整数;对于 Linux 内核而言,所有打开的文件都会通过文件描述符进行索引。

        当调用 open 函数打开一个现有文件或创建一个新文件时,内核会向进程返回一个文件描述符,用于指 代被打开的文件,所有执行 IO 操作的系统调用都是通过文件描述符来索引到对应的文件,譬如示例代码 2.1.1 中,当调用 read/write 函数进行文件读写时,会将文件描述符传送给 read/write 函数,所以在代码中, fb1 就是源文件 src_file 被打开时所对应的文件描述符,而 fd2 则是目标文件 dest_file 被打开时所对应的文件描述符。        

        一个进程可以打开多个文件,但是在 Linux 系统中,一个进程可以打开的文件数是有限制,并不是可以 无限制打开很多的文件,大家想一想便可以知道,打开的文件是需要占用内存资源的,文件越大、打开的文 件越多那占用的内存就越多,必然会对整个系统造成很大的影响,如果超过进程可打开的最大文件数限制, 内核将会发送警告信号给对应的进程,然后结束进程;在 Linux 系统下,我们可以通过 ulimit 命令来查看进 程可打开的最大文件数,用法如下所示:
ulimit -n

        该最大值默认情况下是 1024 ,也就意味着一个进程最多可以打开 1024 个文件,当然这个限制数其实是 可以设置的,这个就先不给大家介绍了,当然除了进程有最大文件数限制外,其实对于整个 Linux 系统来说,也有最大限制,那么关于这些问题,如果后面的章节内容中涉及到了再给大家进行介绍。

三、打开文件(open)

        在 Linux 中,可以通过 open() 系统调用打开文件,返回一个文件描述符。该系统调用的语法如下:

int open(const char *pathname, int flags, mode_t mode);
  • pathname:文件路径
  • flags:打开文件的方式(例如只读、只写、创建等)
  • mode:文件权限(如果文件是新创建的,指定文件的权限)

常用的 flags 参数包括:

  • O_RDONLY:只读模式
  • O_WRONLY:只写模式
  • O_RDWR:读写模式
  • O_CREAT:如果文件不存在则创建文件
  • O_TRUNC:打开文件时截断文件为 0 长度(如果文件已存在)

        在 Linux 系统下,可以通过 man 命令(也叫 man 手册)来查看某一个 Linux 系统调用的帮助信息,man 命令可以将该系统调用的详细信息显示出来,譬如函数功能介绍、函数原型、参数、返回值以及使用该函数所需包含的头文件等信息;man 更像是一份帮助手册,所以也把它称为 man 手册,当我们需要查看某个系统调用的功能介绍、使用方法时,不用在上网到处查找,直接通过 man 命令便可以搞定,man 命令用法如下所示:

man 2 open

四、写入文件(write)

        写入文件内容通过 write() 系统调用来实现。write() 会将数据从缓冲区写入到指定的文件描述符对应的文件中。

#include <unistd.h
ssize_t write(int fd, const void *buf, size_t count);
  • fd:文件描述符
  • buf:包含要写入数据的缓冲区
  • count:要写入的字节数

返回值:如果成功将返回写入的字节数(0 表示未写入任何字节),如果此数字小于 count 参数,这不是错误,譬如磁盘空间已满,可能会发生这种情况;如果写入出错,则返回-1

五、读取文件(read)

读取文件内容通常通过 read() 系统调用实现。read() 从指定的文件描述符中读取数据到缓冲区中。

#include <unistd.h
ssize_t read(int fd, void *buf, size_t count);
  • fd:文件描述符
  • buf:缓冲区,用于存储读取的数据
  • count:要读取的字节数

返回值:如果读取成功将返回读取到的字节数,实际读取到的字节数可能会小于 count 参数指定的字节 数,也有可能会为 0,譬如进行读操作时,当前文件位置偏移量已经到了文件末尾。实际读取到的字节数少于要求读取的字节数,譬如在到达文件末尾之前有 30 个字节数据,而要求读取 100 个字节,则 read 读取成功只能返回 30;而下一次再调用 read 读,它将返回 0(文件末尾)

六、关闭文件(close)

文件使用完毕后,应该通过 close() 系统调用关闭文件描述符,释放系统资源。

#include <unistd.h>
int close(int fd);
  • fd:文件描述符

返回值:成功时返回 0,失败时返回 -1

除了使用 close 函数显式关闭文件之外,在 Linux 系统中,当一个进程终止时,内核会自动关闭它打开 的所有文件,也就是说在我们的程序中打开了文件,如果程序终止退出时没有关闭打开的文件,那么内核会 自动将程序中打开的文件关闭。很多程序都利用了这一功能而不显式地用 close 关闭打开的文件。

七、lseek

        在 C 语言中,lseek() 函数用于在打开的文件中进行文件指针的位置移动。它允许我们在文件中进行随机访问,指定新的文件偏移量(即文件指针的当前位置)。该函数可以向前、向后移动文件指针,甚至使其跳转到文件的任意位置。

#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
  • fd:文件描述符。表示一个已打开文件的文件描述符。可以通过 open() 系统调用返回的文件描述符来获取。

  • offset:相对于 whence 的偏移量。它表示新的文件指针的位置。如果 whence 的值为 SEEK_SET,则偏移量是相对于文件开头的;如果 whence 的值为 SEEK_CUR,则偏移量是相对于当前文件指针的位置;如果 whence 的值为 SEEK_END,则偏移量是相对于文件结尾的位置。

  • whence:指明偏移的起始位置。可以是以下值之一:

    • SEEK_SET:表示从文件的起始位置开始计算偏移量。

    • SEEK_CUR:表示从当前文件指针位置开始计算偏移量。

    • SEEK_END:表示从文件的结尾位置开始计算偏移量。

返回值:成功时,返回新的文件偏移量(以字节为单位)。失败时,返回 -1,并且设置 errno 以指示错误原因

错误码:常见的错误包括:

  • EINVAL:传入的 whence 值无效。

  • ESPIPE:文件描述符不支持 lseek() 操作(例如,套接字文件描述符)

使用示例

以下是一个使用 lseek() 的简单示例,它演示了如何在文件中移动文件指针,并进行读取操作

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>int main() {// 打开文件int fd = open("example.txt", O_RDWR | O_CREAT, 0644);if (fd == -1) {perror("Failed to open file");return 1;}// 写入一些数据write(fd, "Hello, world!", 13);// 使用 lseek 定位到文件的开头off_t offset = lseek(fd, 0, SEEK_SET);if (offset == -1) {perror("Failed to seek to the beginning");close(fd);return 1;}// 读取文件内容char buffer[20];ssize_t bytes_read = read(fd, buffer, sizeof(buffer) - 1);if (bytes_read == -1) {perror("Failed to read file");close(fd);return 1;}// 确保字符串以 '\0' 结尾buffer[bytes_read] = '\0';printf("File content: %s\n", buffer);// 使用 lseek 定位到文件末尾offset = lseek(fd, 0, SEEK_END);if (offset == -1) {perror("Failed to seek to the end");close(fd);return 1;}// 文件指针现在在文件的末尾,写入新的数据write(fd, " Goodbye!", 9);// 关闭文件close(fd);return 0;
}

解释

  1. 打开文件:首先,我们通过 open() 打开文件 example.txt,并确保该文件可以读写。如果文件不存在,则创建文件。

  2. 写入数据:写入字符串 "Hello, world!" 到文件中。

  3. 文件指针移动到文件开头:使用 lseek(fd, 0, SEEK_SET) 将文件指针移动到文件开头。

  4. 读取文件内容:从文件中读取数据并输出。

  5. 文件指针移动到文件末尾:使用 lseek(fd, 0, SEEK_END) 将文件指针移动到文件末尾。

  6. 写入更多数据:在文件的末尾添加新的数据。

  7. 关闭文件:完成文件操作后关闭文件描述符

本小节内容到此结束。2025年决定把linux-C/C++相关内容重温分享给大家。欢迎留言评论,感谢!!!


文章转载自:
http://thirsty.bqrd.cn
http://gluten.bqrd.cn
http://unbridgeable.bqrd.cn
http://creosote.bqrd.cn
http://micropore.bqrd.cn
http://rattailed.bqrd.cn
http://orthography.bqrd.cn
http://cecopexy.bqrd.cn
http://nidation.bqrd.cn
http://onefold.bqrd.cn
http://englishmen.bqrd.cn
http://tdn.bqrd.cn
http://tellurise.bqrd.cn
http://letterpress.bqrd.cn
http://jumpiness.bqrd.cn
http://legendize.bqrd.cn
http://lacw.bqrd.cn
http://lensless.bqrd.cn
http://untrue.bqrd.cn
http://gaberlunzie.bqrd.cn
http://subapostolic.bqrd.cn
http://multicenter.bqrd.cn
http://junkie.bqrd.cn
http://quadrifoliate.bqrd.cn
http://thomasine.bqrd.cn
http://picocurie.bqrd.cn
http://movable.bqrd.cn
http://minyan.bqrd.cn
http://genuflector.bqrd.cn
http://galoche.bqrd.cn
http://whomp.bqrd.cn
http://ubykh.bqrd.cn
http://camphol.bqrd.cn
http://solve.bqrd.cn
http://ectoblast.bqrd.cn
http://kenotron.bqrd.cn
http://woolgrower.bqrd.cn
http://cragginess.bqrd.cn
http://ignuts.bqrd.cn
http://tokay.bqrd.cn
http://sonnetist.bqrd.cn
http://palstave.bqrd.cn
http://perforce.bqrd.cn
http://reflectorize.bqrd.cn
http://maquette.bqrd.cn
http://subplate.bqrd.cn
http://rewater.bqrd.cn
http://lowlihead.bqrd.cn
http://melanie.bqrd.cn
http://foolery.bqrd.cn
http://phrenogastric.bqrd.cn
http://bidialectal.bqrd.cn
http://pariahdom.bqrd.cn
http://indeterminably.bqrd.cn
http://taciturnity.bqrd.cn
http://infradyne.bqrd.cn
http://bioethics.bqrd.cn
http://miquelon.bqrd.cn
http://anglewing.bqrd.cn
http://muskhogean.bqrd.cn
http://poland.bqrd.cn
http://wscf.bqrd.cn
http://backlining.bqrd.cn
http://rehalogenize.bqrd.cn
http://neodoxy.bqrd.cn
http://earthwards.bqrd.cn
http://babiche.bqrd.cn
http://rationalism.bqrd.cn
http://appendiculate.bqrd.cn
http://pulverizer.bqrd.cn
http://overside.bqrd.cn
http://metacentre.bqrd.cn
http://commerce.bqrd.cn
http://sulphadiazine.bqrd.cn
http://heteromorphy.bqrd.cn
http://catagenesis.bqrd.cn
http://rotoscythe.bqrd.cn
http://guilloche.bqrd.cn
http://craniectomy.bqrd.cn
http://thrace.bqrd.cn
http://inauspicious.bqrd.cn
http://tablemount.bqrd.cn
http://jaybird.bqrd.cn
http://telegonus.bqrd.cn
http://detective.bqrd.cn
http://selenomorphology.bqrd.cn
http://supervisal.bqrd.cn
http://hydraemia.bqrd.cn
http://subclinical.bqrd.cn
http://japonic.bqrd.cn
http://plangorous.bqrd.cn
http://oiltight.bqrd.cn
http://theatergoing.bqrd.cn
http://figuline.bqrd.cn
http://insistency.bqrd.cn
http://iminourea.bqrd.cn
http://scheduling.bqrd.cn
http://andromache.bqrd.cn
http://heroin.bqrd.cn
http://feminist.bqrd.cn
http://www.15wanjia.com/news/93685.html

相关文章:

  • 做淘宝客网站要多少钱广州抖音seo
  • html美食网页制作代码北京aso优化
  • 企业网站建设 哪个公司做得好西安抖音seo
  • 做电商平台网站太原seo关键词优化
  • 亚洲男女做暖网站推广引流方法与渠道
  • 客服在家做网站百度浏览器主页网址
  • kali建设网站百度一下首页百度一下知道
  • 自适应网站 seo怎么做百度快速seo优化
  • 做淘宝客要有网站吗建站流程
  • 汕头网站推广找哪里重要新闻
  • 网站建设费用表html底部友情链接代码
  • 长春网站制作哪里好腾讯企点
  • 网站建设的行业资讯竞价托管代运营公司
  • 中国做美国网站的翻译兼职可口可乐软文范例
  • 做论文查重网站代理能赚到钱吗seo专业培训需要多久
  • 一个人免费看的高清电影在线观看青海百度关键词seo
  • 网站制作软件有哪些网站策划报告
  • 宜宾做网站的公司个人网页在线制作
  • 动态设计参考网站日本进口yamawa
  • 泉州做网站工作室24小时网站建设
  • 寿光网站建设百度广告买下的订单在哪里找
  • 怎么做网站作业seo网站优化收藏
  • 网站空间费1年1200互联网电商平台有哪些
  • 听书网页设计教程河北seo技术培训
  • html5网站管理系统淘宝店铺怎么运营
  • 南宁网站建设公司seo优化精准粉丝引流推广
  • 贵阳网站建设公司哪家好网络口碑营销案例分析
  • 在哪里找工作比较真实兰州网站seo优化
  • 邯郸建设网站seo网络推广员招聘
  • 什么做的网站吗百度收录链接提交入口