open和close函数

article/2025/9/14 2:29:25

open函数:打开或创建文件

系统调用open可以用来打开普通文件、块设备文件、字符设备文件、链接文件和管道文件,但只能用来创建普通文件,创建特殊文件需要使用特定的函数。

头文件:

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

函数原型:

int open(const char *pathname,int flages);
int open(const char *pathname,int flages,mode_t mode);

pathname:需要打开或想要创建的含路径的文件名。
flags:文件状态标志位,表示打开文件的方式。
mode:如果文件被新创建,指定该权限为mode(八进制表示法);
返回值:
0:标准输出
1:标准输入
2:标准出错
我们得到的文件描述符都是从3开始的,文件描述符又称文件ID,每个文件的文件描述符都是唯一的。
返回值小于零时,表示创建或打开文件失败。

flages参数
flages参数可以用来说明open函数的多个选择,参数值可以分两类:一类是主标志,一类是副标志。
1)主标志是互斥的,使用了其中一种则不能再使用另外一种。
主标志如下:

O_RDONLY:以只读方式打开
O_WRONLY:以只写方式打开
O_RDWR:以可读可写方式打开

2)副标志可同时使用多个,使用时在主标志和副标志直接加入按位与(|)运算符
副标志如下:

O_CREAT创建一个文件,文件存在时 ,也能成功。如果文件不存在时,才需要用到第三个参数mode,以说明新文件的存取权限
O_EXCL如果O_CREAT也被设置,此命令会检查文件是否存在。若文件不存在,则创建该文件;若文件存在则导致打开文件出错,返回文件描述符-1
O_TRUNC打开文件(将文件里的内容清空)
O_APPEND追加方式打开文件(不会把文件当中已经存在的内容删除)

close()函数:

关闭一个文件,将文件描述符还给Linux系统。通过close函数关闭文件并释放相应的资源,防止内核为继续维护它而付出代价。
头文件

#include <unistd.h>

文件原型

int close(int fd);

参数
fd:即将要关闭的文件描述符。
返回值
0:成功 -1:失败

利用open函数实现touch命令:

程序如下:
O_CREAT:创建一个文件,文件存在时 ,也能成功
若 O_CREAT|O_EXCEL,文件存在时创建文件,返回的文件描述符为-1,创建失败

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc,char *arge[])//
{int fd;fd = open(arge[1],O_CREAT|O_EXCL | O_RDWR,0777);if(fd < 0){printf("creat file %s failure\n",arge[1]);return -1;}printf("creat file %s is sucess, fd = %d\n",arge[1],fd);close(fd);return 0;
}

在这里插入图片描述
umask 掩码
open函数创建文件的权限=mode &(~umask)

O_RDWR :文件的权限为可读可写

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc,char *arge[])//传参
{int fd;fd = open(arge[1],O_CREAT | O_RDWR,0777);//与掩码0022异或,所以其权限为755if(fd < 0){printf("creat file %s failure\n",arge[1]);return -1;}printf("creat file %s is sucess, fd = %d\n",arge[1],fd);close(fd);return 0;
}

在这里插入图片描述
O_APPEND:追加方式打开文件(不会把文件当中已经存在的内容删除)

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc,char *arge[])
{int fd;fd = open("./a.c",O_APPEND | O_RDWR);if(fd < 0){printf("open file %s failure\n",arge[1]);return -1;}printf("open file %s is sucess, fd = %d\n",arge[1],fd);close(fd);return 0;
}

在这里插入图片描述
O_TRUNC 打开文件(会把已经存在的内容删除)

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc,char *arge[])
{int fd;fd = open("./a.c",O_TRUNC | O_RDWR);if(fd < 0){printf("open file %s failure\n",arge[1]);return -1;}printf("open file %s is sucess, fd = %d\n",arge[1],fd);close(fd);return 0;
}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/cq3E34Vi.shtml

相关文章

linux close 头文件,Linux open close read write lseek函数的使用

我们经常需要在Linux中进行文件操作,今天我就来分享下文件操作用到的一些函数 1 open 所需头文件: 函数原型:int open(const char *pathname,flags,int perms) pathname:被打开的文件名,可包含路径 flag :文件打开的方式,参数可以通过“|” 组合构成,但前3 个参数不能互…

linux的open close函数

目录 opencloseopen 参数说明代码 解析报错不用怕,我提供解决思路 前言 开始进入学linux的第一个阶段 第一阶段的 Linux的系统函数 第一节 先讲 open close 函数 open 怎么在liunx查看呢 我们利用下面的命令 linux自带的工具 man 手册 man 1 是普通shell 的命令 比如 ls ma…

简述Java序列化的几种方式

目录 JDK原生的序列化 字符串获取字节流 Protobuf Protostuff Thrift kryo hessian fst JSON字符串序列化 Jackson Gson FastJson 序列化和反序列化在网络传输过程中需要做的事情。 序列化 就是得的 字节流&#xff0c;反序列化就是得的对象。 下面梳理Java编程需要…

java序列化之writeObject 和readObject

什么是序列化和反序列化&#xff1f; 序列化&#xff1a;将对象转化为字节的过程称为序列化过程。 反序列化&#xff1a;将字节转化为对象的过程称为反序列化。 序列化主要应用于网络传输和数据存储的场景。在java中&#xff0c;只有类实现了java.io.serializable接口&#x…

java序列化总结

目录 对象序列化是什么 为什么需要序列化与反序列化 序列化及反序列化相关知识 Java 序列化中如果有些字段不想进行序列化&#xff0c;怎么办&#xff1f; Java序列化接口 java.io.Serializable 使用序列化和serialVersionUID进行类重构 Java外部化接口 java.io.Externa…

java序列化接口Serializable

Serializable接口说明 类的可序列化性通过实现(implements) java.io.Serializable可序列化接口。 没有实现这个接口的类不会将其任何状态序列化或反序列化。 可序列化类的所有子类型本身可序列化。 序列化接口没有方法或字段只用于识别可序列化的语义。 为了允许序列化不可序…

Java序列化之serialVersionUID

Java序列化之serialVersionUID 今天讲一讲Java对象中的serialVersionUID&#xff0c;先从序列化讲起。 什么是序列化 序列化&#xff0c;简单的说&#xff0c;就是将一个对象转化&#xff08;编码&#xff09;成可以传输的输出流&#xff08;字节流&#xff09;。而反序列化…

一文了解Java序列化与反序列化

目录 序列化示例有父类的对象序列化Serializable和Externalizable区别序列化和反序列化实现serialVersionUID不一致有什么问题1、先注释掉反序列化代码, 执行序列化代码, 然后User类新增一个属性sex2、再注释掉序列化代码执行反序列化代码3、指定serialVersionUID 序列化字段修…

一篇搞懂java序列化Serializable

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。 一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途&#xff1a; 1&#xff09; 把对象…

Java序列化与数据传输

1&#xff09;什么是序列化 ① 序列化&#xff1a;Java 提供了一种对象序列化的机制&#xff0c;该机制中&#xff0c;一个对象可以被表示为一个字节序列&#xff0c;该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。 堆内存中的java对象数据&…

java序列化的作用

1.java序列化需要实现Serializaible接口或者Externalizable接口 2.java实现序列化的作用: 1.方便在远程调用时对象的解码与编码,就像new对象之间直接调用&#xff0c;不需要像传输对象之间像JSON转换一样转来转去 2.序列化的能力&#xff1a;为了在程序中能直接以对象的形式进…

Java序列化与反序列化

参考链接&#xff1a; Java 序列化与反序列化_Jacks丶的博客-CSDN博客_java反序列化 1 序列化与反序列化的概念 Java 序列化是指&#xff1a;将对象转化成一个字节序列(二进制数据)的过程。 将序列化对象写入文件之后&#xff0c;可以从文件中读取出来&#xff0c;并且对它…

Java序列化

一、什么是序列化&#xff1f;为什么要序列化&#xff1f; Java 序列化就是指将对象转换为字节序列的过程&#xff0c;而反序列化则是只将字节序列转换成目标对象的过程。 我们都知道&#xff0c;在进行浏览器访问的时候&#xff0c;我们看到的文本、图片、音频、视频等都是通…

【JAVA基础】java基础之-序列化详解

写在前面的话 脑子是个好东西&#xff0c;可惜的是一直没有搞懂脑子的内存删除机制是什么&#xff0c;所以啊&#xff0c;入行多年&#xff0c;零零散散的文章看了无数&#xff0c;却总是学习了很多也忘了很多。 痛定思痛的我决定从今天开始系统的梳理下知识架构&#xff0c;记…

JAVA的序列化

絮叨 Java序列化其实这个用的多不多&#xff0c;我觉得看公司的技术栈吧&#xff0c;如果用的是cloud那套&#xff0c;估计接触的会少点&#xff0c;但是也不是说没有&#xff0c;如果是dubbo那套的话&#xff0c;就多点&#xff0c;上次我们说Netty的编码解码的时候说到了谷歌…

MySQL卸载重新安装会遇到的问题及解决方式

好家伙&#xff0c;全踩雷了&#xff1a; 一.使用cd命令无法进入到其他盘符&#xff1f; 解决&#xff1a;在cd后加/d&#xff0c;两者之间用空格隔开 二.初始化时没有给出密码&#xff1f; 解决&#xff1a;仔细检查my.ini配置文件中的配置命令&#xff0c;一般是配置命令写错…

如何将MySQL卸载干净?

前言 前几天不知道什么情况电脑被莫名下载了MySQL8.0版本导致与本机的MySQL5.0版本冲突&#xff0c;导致MySQL无法正常运行&#xff0c;后来因为没有卸载干净MySQL导致一直下载不成功&#xff0c;导致我晚上失眠&#xff0c;现在让我们进入正题&#xff0c;看看如何将他卸载干…

【通关MySQL】Win11如何将MySQL卸载干净?

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f680;&#x1f680;系列专栏:【通关MySQL】 ✈️✈️本篇内容: MySQL如何卸载干净&#xff1f; ⛵⛵作者简介&#xff1a;一名双非本科大三在读的科班Java编程小白&#xff0c;道阻且长&#xff…

如何能将mysql卸载干净

本篇文章介绍一下如何干净卸载mysql。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。 第七步出现找不到相应的文件夹。第七步&#xff1a;路径是C:\Users\你的用户名字\AppData\Roaming\MySQL 有可能是隐藏的&#xff0c;需要显示隐藏…

如何将mysql卸载干净

一、在控制面板中卸载mysql软件 二、卸载过后删除C:\Program Files (x86)\MySQL该目录下剩余了所有文件&#xff0c;把mysql文件夹也删了 三、windowsR运行“regedit”文件&#xff0c;打开注册表 四、删除注册表&#xff1a;HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Service…