Linux系统编程笔记--系统(文件)I/O操作

news/2025/3/16 16:10:25/

目录

1--文件描述符

2--系统I/O常用函数

3--标准I/O和系统I/O的区别

4--原子操作

5--dup()和dup2()

6--fcntl()和ioctl()


1--文件描述符

        文件描述符的实质:一个整型数,一个数组下标(数组的元素指向文件结构体);

        文件描述符优先使用可用范围内最小的;

        标准输入(stdin)的文件描述符为 0;标准输出(stdout)的文件描述符为 1;标准错误(stderr)的文件描述符为 2;因此其余文件描述符肯定 >= 3;

2--系统I/O常用函数

以下常用函数可通过 man 手册查看其用法;

        open():

        close():

        read();

        write();

int open(const char *pathname, int flags);
int close(int fd);
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>#define BUF_SIZE 1024int main(int argc, char* argv[]){int sfd, dfd;char* buf[BUF_SIZE];int len, ret, pos;if(argc < 3){fprintf(stderr, "Usage...\n");exit(1);}sfd = open(argv[1], O_RDONLY);if(sfd < 0){perror("open()");exit(1);}dfd = open(argv[2], O_WRONLY|O_CREAT, O_TRUNC, 0600);if(dfd < 0){close(sfd);perror("open()");exit(1);}printf("%d %d\n", sfd, dfd); // 3 4while(1){len = read(sfd, buf, BUF_SIZE);if(len < 0 ){perror("read()");break;}if(len == 0) break;pos = 0;while(len > 0){ret = write(dfd, buf+pos, len);  if(ret < 0){perror("write()");exit(1);}pos += ret;len -= ret;}}close(dfd);close(sfd);exit(0);
}

3--标准I/O和系统I/O的区别

        标准I/O的吞吐量大(会先把数据放到缓冲区,刷新缓冲区之后才会完成数据的存取),系统I/O的响应速度快(不会把数据放到缓冲区,一次调用就完成一次操作);

        标准I/O和系统I/O最好不要混用;

        标准I/O和系统I/O的转换函数:fileno() fdopen()

int mian(){putchar('a');write(1, "b", 1);putchar('a');write(1, "b", 1);putchar('a');write(1, "b", 1);
}// 程序会打印:bbbaaa
// 因为标准I/O打印的 a 会先放到缓冲区中,后面一次完成输出;

4--原子操作

原子操作:不可分割的操作;

原子操作的作用:解决竞争与冲突;

5--dup()和dup2()

#include <unistd.h>int dup(int oldfd);
int dup2(int oldfd, int newfd); // 原子操作// dup 复制(准确来说,将当前文件描述符对于文件的权限共享过来给新的文件描述符了)当前的文件描述符
// dup 返回一个新的文件描述符,新旧文件描述符共享访问同一个文件
// dup 返回的新文件描述符一定是当前可用文件描述中的最小数值// dup2是原子操作,不能被打断,它会关闭旧的文件描述符
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#define FNAME "./out"int main(){int fd = open(FNAME, O_WRONLY|O_CREAT|O_TRUNC, 0600);if(fd < 0){perror("open()");exit(1);}// close(1); // 关闭标准输出// dup(fd); // 关闭标准输出后,1成了最小的可用文件描述符,因此dup(fd)后,1和最初的fd共享打开的文件dup2(fd, 1); // 原子操作,功能等同于上面两句if(fd != 1){close(fd);}// 上面语句的功能相当于是将文件描述符1映射到打开的文件,即打开文件的文件描述符 fd = 1// puts默认打印到标准输出,但此时标准输出被关闭了// 文件描述符1其实指向的是打开的文件,因此puts打印到了打开的文件里puts("hello!"); exit(0);
}

6--fcntl()和ioctl()

#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );// fcntl() performs one of the operations described below on the open file descriptor fd.  
// The operation is determined by cmd.// fcntl() 根据提供的 cmd 来对输入的 fd 进行相关操作
#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);// ioctl 是设备驱动程序中设备控制接口函数
// 一个字符设备驱动通常会实现设备打开、关闭、读、写等功能
// 在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。


http://www.ppmy.cn/news/1106343.html

相关文章

【校招VIP】专业课考点之网络存储

考点介绍&#xff1a; cookie、session和localstorage 是目前常用的存储机制&#xff0c;不管是大厂还是中小公司&#xff0c;都会对这个问题有比较高的考察频度&#xff0c;而且有一定的深度和对比分析 专业课考点之网络存储-相关题目及解析内容可点击文章末尾链接查看&#…

自然语言处理学习笔记(十)———— 停用词过滤

目录 1.停用词 2.实现思路 3.全部实现代码&#xff1a; 4.运行结果&#xff1a; 1.停用词 汉语中有一类没有多少意义的词语&#xff0c;比如助词“的”、连词“以及”、副词“甚至”、语气词“吧”&#xff0c;称为停用词。一个句子去掉了停用词并不影响理解。停用词视具体任…

策略模式:切换算法的灵活性

欢迎来到设计模式系列的第十二篇文章&#xff01;在之前的文章中&#xff0c;我们已经学习了许多常用的设计模式&#xff0c;今天我们将介绍另一个重要的设计模式——策略模式。 策略模式简介 策略模式是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个…

leetcode分类刷题:栈(Stack)(三、下一个更大的数)

1、本次博客总结的“栈&#xff08;Stack&#xff09;&#xff08;三、下一个更大的数&#xff09;”类型具体是指寻找任一个元素的右边/左边第一个比自己大/小的元素的位置&#xff0c;这与栈的先入后出思想一致 2、这种题目用栈处理的算法模板往往叫做单调栈&#xff0c;是因…

java8-Stream流常用API

什么是 Stream Stream&#xff08;流&#xff09;是 Java 8 引入的一个新的抽象概念&#xff0c;它代表着一种处理数据的序列。简单来说&#xff0c;Stream 是一系列元素的集合&#xff0c;这些元素可以是集合、数组、I/O 资源或者其他数据源。 Stream API 提供了丰富的操作方…

seatunnel win idea 本地调试

调试FakeSource&#xff0c;LocalFile # Set the basic configuration of the task to be performed env {execution.parallelism 1job.mode "BATCH" }# Create a source to connect to Mongodb source {# This is a example source plugin **only for test and d…

【C++从0到王者】第二十八站:二叉搜索树的应用

文章目录 前言一、Key模型二、Key/Value模型总结 前言 二叉搜索树的在现实世界的应用很广泛&#xff0c;比如Key模型&#xff0c;Key-Value模型就是常见的两种的模型 一、Key模型 K模型&#xff1a;K模型即只有key作为关键码&#xff0c;结构中只需要存储Key即可&#xff0c…

小程序分销机制介绍,小程序二级分销功能有哪些?

为什么有越来越多的用户选择使用小程序&#xff1f;跟“高大上”的APP相比&#xff0c;小程序不仅可以减少下载安装的复杂流程&#xff0c;还具备操作便捷、沉淀私域数据的优势。蚓链分销小程序具备裂变二维码、实时分佣、分销身份升级、层级分佣、商品个性化佣金设定等功能&am…