详解C中的系统调用open/close/read/write

article/2025/9/14 1:34:05

文章目录

  • open() and close()
  • read() and write()
  • 实操:代码示例
    • 1 将in.txt文件中的内容写入到out.txt文件中(一个一个字符写入)
    • 2 将in.txt文件中的内容写入到out.txt文件中(数组写入)


先谈谈open/close/read/write与fopen/fclose/fread/fwrite的区别

  • open/close/read/write是低级IO, 是系统调用函数
  • fopen/fclose/fread/fwrite是高级IO,是标准库中的函数

后者由前者实现:例如getchar()

int getchar (void){  char c;return ( read (0, &c, 1) == 1) ? (int)c : EOF);
}

附图:对应的一些特殊文字描述符在这里插入图片描述



open() and close()

|| 函数概述

  • fopen() 是 C 标准库中的函数,而 open() 是 Linux 中的系统调用函数
  • 头文件:#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h >#include <unistd.h>
  • 定义函数
    • int open(const char *pathname, int flags);
    • int open(const char *pathname, int flags, mode_t mode);

如果未创建文件,则open()调用返回-1;如果成功创建,则返回数字> = 0,即文件描述符。(fopen返回的是一个文件指针)


|| 参数相关

  • 第一个参数路径

  • 第二个参数是打开方式:指令如下

    指令说明
    O_RDONLY(r)以只读方式打开文件
    O_WRONLY(w)以只写方式打开文件
    O_RDWR (r+)以可读写方式打开文件. 上述三种旗标是互斥的, 也就是不可同时使用, 但可与下列的旗标利用OR(
    -------------------------------------------------------------------------
    O_APPEND(a)当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文件后面.
    O_CREAT若欲打开的文件不存在则自动建立该文件.
    O_EXCL如果O_CREAT 也被设置, 此指令会去检查文件是否存在. 文件若不存在则建立该文件, 否则将导致打开文件错误. 此外, 若O_CREAT 与O_EXCL 同时设置, 并且欲打开的文件为符号连接, 则会打开文件失败.
    O_TRUNC若文件存在并且以可写的方式打开时, 此旗标会令文件长度清为0, 而原来存于该文件的资料也会消失.

    tip:以上前三种flagO_RDONLY,O_WRONLY, RDWR是互斥的,但可以搭配OR(|)与下面flag一起使用


  • 第三个参数mode权限设置:
    该参数只有在建立新文件时才会生效,即当flag为O_CREAT时使用mode设置

    指令说明
    S_IRWXU00700 权限代表该文件所有者具有可读、可写及可执行的权限.
    S_IRUSR 或S_IREAD00400 权限代表该文件所有者具有可读取的权限.
    S_IWUSR 或S_IWRITE, 00200 权限代表该文件所有者具有可写入的权限.
    S_IXUSR 或S_IEXEC, 00100 权限代表该文件所有者具有可执行的权限.
    S_IRWXG 00070 权限代表该文件用户组具有可读、可写及可执行的权限.
    S_IRGRP 00040 权限代表该文件用户组具有可读的权限.
    S_IWGRP 00020 权限代表该文件用户组具有可写入的权限.
    S_IXGRP 00010 权限代表该文件用户组具有可执行的权限.
    S_IRWXO 00007 权限代表其他用户具有可读、可写及可执行的权限.
    S_IROTH 00004 权限代表其他用户具有可读的权限
    S_IWOTH 00002 权限代表其他用户具有可写入的权限.
    S_IXOTH 00001 权限代表其他用户具有可执行的权限.

creat()
此外,还有一个单独的int creat(char *名称,int perms)系统调用专门用于创建文件。 它的用法等效于使用O_WRONLY |调用open()。 O_CREAT | O_TRUNC。


close()
int close(int fd); 关闭描述符编号为fd的文件。 成功返回0,如果发生错误则返回-1。
完成使用文件的操作后,必须关闭文件。




read() and write()

|| 函数概述

  • 从文件描述符号为fd的文件读取到大小为len的buf指向的存储区中(联系fread())
int read(int fd,char * buf,int len); 
  • 从大小为len的存储区buf写入文件描述符编号为fd的文件
int write(int fd,const char * buf,int len); 

read()和write()在出错时返回-1,在成功时返回传输的字节数



实操:代码示例

1 将in.txt文件中的内容写入到out.txt文件中(一个一个字符写入)

#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>void error(char *str, char *filename){printf(str, filename); exit(-1);
}int main(){int f1, f2,n;char buf, file1[] = "in.txt", file2[] = "out.txt";if((f1 = open(file1, O_RDONLY)) == -1 ) error("Error open file %s" ,file1);if((f2 = open(file2, O_CREAT|O_WRONLY|O_TRUNC)) == -1) error("Error open file %s" ,file2);while ((n = read(f1, &buf, 1)) > 0) // 调用read,一个一个字符读if(write(f2, &buf, n) != n)  error("error write in file %s", file2);if(n < 0) error("error read from file %s", file1);close(f1); close(f2);return 0;}

2 将in.txt文件中的内容写入到out.txt文件中(数组写入)

#include <stdio.h>
#include<stdlib.h> 
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#define bsize 10void error(char * str, char*filename)
{	printf(str,filename); exit(-1); }int main(void){ int f1,f2,n;  char buf[bsize], file1[]="in.txt",file2[]="out.txt"; if ((f1 = open(file1, O_RDONLY)) == -1) error("Error open file %s", file1); if ((f2 = open(file2, O_CREAT|O_WRONLY|O_TRUNC,0644)) == -1)          error("Error open file %s", file2); while ((n = read(f1, buf, bsize)) > 0) if (write(f2, buf, n ) != n) error("error write in file %s",file2);if (n<0) error("error read from file %s",file1);close( f1); close(f2); 
return 0; 
}

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

相关文章

JavaScript中window对象及open和close使用

Window对象 是一个顶级对象&#xff0c;不是任何对象的属性&#xff0c;所以可以不写window.xxx而直接使用内部的属性和方法。 实际上&#xff0c;在web前端开发时&#xff0c;所有的全局变量都自动成为window对象的属性 Window对象的属性 Screen History Location Navigat…

Python基础(十三)——文件操作(open函数、close函数)

本文以Python3以上为学习基础。 目录 1、 使用文件操作第一原则 2、open函数 2.1、文件打开模式 2.1.1、只读模式打开文件——只读&#xff08;r&#xff09; 2.1.2、读写模式打开文件——读写模式&#xff08;r&#xff09; ​ 2.1.3、写模式打开文件——写模式&#…

layer中的open与close

关于layer中的open方法与close方法 open方法open函数的定义open函数里面optionsopen函数中返回的值 close方法如何使用close方法关于layer中的一些发现 写在最后的话 open方法 open函数用来创建一个弹出层。 open函数的定义 形式为&#xff1a;layer.open(options) 例如&…

open函数详解与close函数详解

open() 头文件&#xff1a;#include<fcntl.h>//在centos6.0中只要此头文件就可以#include<sys/types.h>#incldue<sys/stat.h> 功能&#xff1a;打开和创建文件&#xff08;建立一个文件描述符&#xff0c;其他的函数可以通过文件描述符对指定文件进行读取与…

open和close函数

open函数&#xff1a;打开或创建文件 系统调用open可以用来打开普通文件、块设备文件、字符设备文件、链接文件和管道文件&#xff0c;但只能用来创建普通文件&#xff0c;创建特殊文件需要使用特定的函数。 头文件&#xff1a; #include <sys/types.h> #include <…

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的编码解码的时候说到了谷歌…