Linux学习记录(二)-------文件IO

news2024/9/22 11:34:38

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
    • 文件IO
      • 1.函数open
      • 2.函数close
      • 3.函数lseek
      • 4.函数read
      • 5.函数write


前言

文件IO

Linux 自带的工具:man手册

man 1 是普通的shell命令,比如ls

man 2 是系统调用函数,比如open,write,read

文件描述符:对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读、写一个文件时,使用open或creat返回的文件描述符标识该文件,将其作为参数传送给read或write。--------可以理解为ID表示为对应文件的标志(自身理解)

shell中的惯例

文件描述符含义
0STDIN_FILENO标准输入
1STDOUT_FILENO标准输出
2STDERR_FILENO标准错误

Linux文件权限

Linux 系统中采用三位十进制数表示权限,如0755,0644.

7 1 + 2 + 4

5 1 + 4

5 1 + 4

  • ABCD
  • A-0,表示十进制
  • B-用户
  • C-组用户
  • D-其他用户
‐‐‐ ‐> 0 (no excute , nowrite ,no read)
‐‐x ‐> 1 excute(执行), (nowrite, no read)
‐w‐ ‐> 2 write
r‐‐ ‐> 4 read
‐wx ‐> 3 write, excute
r‐x ‐> 5 read, excute
rw‐ ‐> 6 read, write 
rwx ‐> 7 read, write , excute

1.函数open

包含的头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函数:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

返回值:成功,返回文件描述符;
    	出错,返回-1
参数说明:
    	/*
    	 * pathname:打开或要创造的文件名---只写文件名默认当前目录/若文件名加上路径,就按照绝对路径来打开文件
    	 * flags:表示打开文件之后的操作
    	 */
    eg: open(path,O_RDWR | O_CREAT,0755);

常用的flags宏定义

O_RDONLY:只读模式 0x 0000 0000

O_WRONLY:只写模式 0x 00000001

O_RDWR:可读可写 0x 00000002

O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。0x00002000

O_CREAT 表示如果指定文件不存在,则创建这个文件 0x0000 0100

O_EXCL 表示如果要创建的文件已存在,则出错,同时返回-1,并且修改errno 的值。

O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。

O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端

2.函数close

可调用close函数关闭一个打开文件

#include <unistd.h>

int close(int fd);

返回值:成功,返回0;
    	出错,返回-1
参数说明:/*
		 *fd 文件描述符
		 */
    eg:close(fd)

练习1:打开一个文件(读写模式),若不存在该文件创造并设置为0755

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
        int fd;//定义一个文件描述符
        fd = open("mm",O_RDWR|O_CREAT,0755);//打开一个叫mm的文件,若不存在则创造,文件权限0755
        if(fd == -1)//打开文件失败
        {
                printf("Opening a file mm falied\n");//
                return -1;
        }
        printf("Opening a file mm successed\n");//打开文件成功
        close(fd);//关闭文件
        return 0;
}

在这里插入图片描述

3.函数lseek

可以调用显式地为一个打开文件设置偏移量

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

返回值:若成功,返回新的文件偏移量;若出错,返回-1.
参数说明:/*
		 *fd : 文件描述符
		 *offset 文件偏移量
		 *whence:设置偏移量的基准
		 */
		 

若wehence参数为SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节

若wehence参数为SEEK_CUR,则将该文件的偏移量设置为其当前值加offset,offset可为正可为负

若wehence参数为SEEK_END,则将该文件的偏移量设置为文件长度加offset,offset可为正可为负

4.函数read

调用read从打开文件中读数据

#include <unistd.h>

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

参数说明/*
		*fd:文件描述符
		* *buf:存储读到的数据
		* sizet_t Count :每次读的字节数
		*/
返回值:读到的字节数,若到文件尾,返回0;若出错,返回-1

5.函数write

调用write函数向打开的文件写数据

#include <unistd.h>

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

参数说明:/*
		 *fd:文件描述符
		 * *buf:要写入的数据
		 * size_t nbyte :每次写的字节数
		 */
返回值:若成功,返回已写的字节数;若出错,返回-1

main函数参数:

int main(int argc,char *argv[])
{

	return 0;
}

C语言规定了main函数的参数只能有两个,一个是argc,一个是argv并且,argc只能是整数,第二个必须是指向字符串的指针数组。

由于main函数不能被其它函数调用, 因此不可能在程序内部取得实际值。那么,在何处把实参值赋予main 函数的形参呢? 实际上,main函数的参数值是从操作系统命令行上获得的。当我们要运行一个可执行文件时, 在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去。DOS提示符下命令行 的一般形式为:

./a.out 参数1 参数2…

C:>可执行文件名 参数 参数……; 但是应该特别注意的是,main 的两个形参和命令行中的参数在 位置上不是一一对 应的。

  • argc: 参数表示命令行中参数的个数(注意 文本名本身也是一个参数),rgc的值是在输入命令行时由系统按 实际参数的个数自动赋予的。
  • argv :参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 指针数组 的长度即为参数个数。数组元素初值由系统自动赋予。

练习:实现cp指令

src 源文件 des 目标文件

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define READMAX 128


int main(int argc,char *argv[])
{
	int fd1,fd2;//定义两个文件描述符
	int ret;//用于存放读到或写入的返回值
	char ReadBuff[READMAX] = {0};//读入的数据
	if(argc < 3)//如果参数不满足要求则退出
	{
		printf("error\n");
        return -1;
	}
	fd1 = open(argv[1],O_RDWR|O_CREAT,0755);//打开要复制的文件
	if(fd1 == -1)
	{
		printf("Opening a file1 mm falied\n");
		return -1;
	}
	printf("Opening a file1 successed\n");
	
	fd2 = open(argv[2],O_RDWR|O_CREAT,0755);//打开要粘贴的文件
	if(fd2 == -1)
	{
		printf("Opening a file2 mm falied\n");
		return -1;
	}
	printf("Opening a file2 successed\n");
	
	while(1)
	{
		ret = read(fd1,ReadBuff,128);//读要复制的文件将数据存入ReadBuff
		if(ret < 128)//判断实际读入的字节数若小于128则表示读完
		{
			write(fd2,ReadBuff,ret);//写入读到的数据到要粘贴的文件
			break;
		}
		else if(ret == -1)
		{
			printf("read error\n");
			return -2;
		}
		ret = write(fd2,ReadBuff,ret);//写入读到的数据到要粘贴的文件
		if(ret == -1 | ret != 128)
		{
			printf("write error\n");
			return -3;
		}
	}
	close(fd1);//关闭文件1
	close(fd2);//关闭文件2
	return 0;
}


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新CSS3横向菜单的实现

横向菜单 原始代码&#xff1a; <nav class"list1"><ul><li><a href"#">Shirts</a></li><li><a href"#">Pants</a></li><li><a href"#">Dresses</a>…

零基础STM32单片机编程入门(二十五) 内部FLASH模拟EEPROM实战含源码

文章目录 一.概要二.FLASH模拟EEPROM的优势三.FLASH模拟EEPROM的原理四.数据读写步骤五.数据转移流程图六.FLASH模拟EEPROM读写例程七.CubeMX工程源代码下载八.小结 一.概要 STM32F103C8T6是一款强大而灵活的微控制器&#xff0c;它的片内Flash存储器可以用来存储有关数据&…

sqli-labs-php7-master第5-10关

第五关&#xff1a; 根据提示输入ID,随便来个一 输入100&#xff0c;因为数据库没有&#xff0c;所以这里没输出内容 还是先找注入点&#xff1a;输入单引号试试 注入点找到了‘ 查询数据库列数&#xff1b;&#xff1f;id1 order by 4 -- 测试发现order by 3时页面正常&…

C++笔试练习笔记【5】:最小花费爬楼梯(有题目链接) 初识动态规划

文章目录 题目思路代码 动态规划简介**一、什么是动态规划****二、动态规划的应用场景****三、动态规划的基本步骤****四、动态规划的优缺点** 题目 题目链接&#xff1a;https://www.nowcoder.com/practice/9b969a3ec20149e3b870b256ad40844e?tpld230&tpld39751&ru/…

探索人工智能技术的发展导致知识崩溃危险的可能性

概述 本文分析了人工智能&#xff08;AI&#xff09;技术的发展在缩小人类知识库方面的潜力。 作者认为&#xff0c;如果大语言模型&#xff08;LLMs&#xff09;等人工智能技术迅速发展&#xff0c;人工智能生成的内容成为人类接触的大部分信息&#xff0c;那么长尾知识&…

python图表没有正确显示中文,这通常是因为matplotlib的默认设置不支持中文字符,或者相应的字体没有正确加载。

如果图表没有正确显示中文&#xff0c;这通常是因为matplotlib的默认设置不支持中文字符&#xff0c;或者相应的字体没有正确加载。你可以通过指定支持中文的字体来解决这个问题。下面是如何设置matplotlib以确保能够在图表中显示中文的步骤&#xff1a; 方法1&#xff1a;全局…

python的多线程

python的threading模块&#xff0c;它提供了丰富的接口来创建和管理线程。 定义一个函数print_numbers&#xff0c;这个函数将由线程执行。在这个函数中&#xff0c;我们使用一个循环来打印数字&#xff0c;并使用time.sleep(1)来模拟每个数字打印之间有1秒的延迟。 在 if __…

Windows应急响应-排查方式

目录 Windows应急响应排查流程一、账户排查排查方法&#xff08;1&#xff09;查看用户信息&#xff08;2&#xff09;lusrmgr.msc手动查&#xff08;比较麻烦&#xff09;&#xff08;3&#xff09;检测克隆账户 ---可使用安全工具D盾进行检测&#xff0c;同时可以直接查看端口…

群辉NAS利用AList搭建混合云盘⑥挂接腾讯微云

目录 ……接前文 5、挂接腾讯微云 未完待续…… ……接前文 5、挂接腾讯微云 登录AList后台→管理→存储→驱动供选择“腾讯微云”→填写挂接路径 打开“配置文档”(详见前文) 打开配置文档→简体中文→开始→找到腾讯微云部分,可以看到关于Cookie的设置方法。 手工用…

第十二章 元数据管理10分

12.1 引言 如果没有元数据&#xff0c;组织可能根本无法管理其数据。 ISO/IEC11179 元数据注册标准。 元数据管理原则&#xff1a;应归尽归&#xff0c;应收尽收。衡量标准&#xff1a;目录是否完整。&#xff08;去第十二章 元数据管理&#xff09;。 主数据管理&#xff1a;主…

(Javaweb)Ajax,Axios,Vue

目录 一.Ajax 二.Axios 三.前端工程化 四.接口文档的管理平台YAPI 五.Vue项目 六.Vue项目开发流程 一.Ajax 1.通过Ajax从服务器端获取数据 Ajax---JavaScript&#xff08;网页行为&#xff09;XML&#xff08;标记语言--用来存储数据&#xff09; 客户端--浏览器 服务…

【C++】深入理解类和对象(1)

自己打败自己是最可悲的失败&#xff0c;自己战胜自己是最可贵的胜利。&#x1f493;&#x1f493;&#x1f493; 目录 ✨说在前面 &#x1f34b;知识点一&#xff1a;类的定义 • &#x1f330;1.类定义格式 • &#x1f330;2.访问限定符 • &#x1f330;3.类域 &…

人工智能时代,程序员当如何保持核心竞争力?

目录 前言 一.AI辅助编程对程序员工作的影响 二.程序员应重点发展的核心能力 三.人机协作模式下的职业发展规划 结束语 前言 随着AIGC&#xff08;如chatgpt、midjourney、claude等&#xff09;大语言模型接二连三的涌现&#xff0c;AI辅助编程工具日益普及&#xff0c;程序…

C++第三十一弹---C++继承机制深度剖析(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 1.菱形继承及菱形虚拟继承 1.1 单继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承。 Student的直接父类是Person&#xff…

双向循环链表和内核链表

目录 双向循环链表 结构设计 初始化 插入 删除 遍历&#xff08;顺序/逆序&#xff0c;打印输出&#xff09; 查找 主函数 内核链表 内核链表初始化定义 内核链表的插入定义 内核链表的遍历定义 内核链表剔除节点定义 内核链表如何移动节点定义 内核链表的应用 临时补充…

身在职场,不得不提防的几个问题,能让少走许多弯路

职场路本就崎岖&#xff0c;如果再走了弯路&#xff0c;脚下的路将会更漫长且难走。 谁不想一帆风顺&#xff0c;可谁又能一帆风顺&#xff1f;不是人心险恶&#xff0c;而是立场本就不同&#xff0c;为了各自的利益考虑无可厚非。 你可以说凭借能力获取利益&#xff0c;为什…

CVE-2023-37569~文件上传【春秋云境靶场渗透】

# 今天我们拿下CVE-2023-37569这个文件上传漏洞# 经过简单账号密码猜测 账号&#xff1a;admin 密码&#xff1a;password# 找到了文件上传的地方# 我们直接给它上传一句话木马并发现上传成功# 上传好木马后&#xff0c;右键上传的木马打开发现上传木马页面# 直接使用蚁剑进行连…

Linux5:Shell编程——函数、重定向

目录 前言 一、函数 1.函数结构 2.函数实例 3.函数传参 二、重定向 1.输出重定向 2.输入重定向 3.同时使用 4.重定向深入了解 5.垃圾桶 总结 前言 Shell编程将会在本章完结 一、函数 1.函数结构 #!/bin/sh # 函数function fun1() {echo "this is a funtion&q…

【有手就行】:从无到有搭建后端SpringBoot项目

前言 想静下心来写点东西&#xff0c;但是确实想不到该写点啥&#xff0c;可能是少了点感觉吧 &#x1f622;。前面刚整理了下前端VUE&#xff0c;就想了下把后端也一起整理下吧&#xff0c;免得换电脑了安装环境又要弄半天&#xff0c;那就开搞吧 首先 准备环境 1.安装IDEA…

云计算实训21——mysql-8.0.33-linux-glibc安装及使用

一、mysql-8.0.33-linux-glibc安装 安装步骤 1.解压 tar -xvf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz 2.清空其他环境 rm -rf /etc/my.cnf 3.安装依赖库 yum list installed | grep libaio 4.创建用户 useradd -r -s /sbin/nologin mysql 查看 id mysql 5.创建mysql-fi…