Linux系统编程——文件的打开及创建

打开(open)

使用open函数需要包含以下三个头文件:

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

open的函数定义格式

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

函数定义的参数解读

1.pathname:指向文件的路径

指定文件格式:./文件夹名字/指定文件名字

当前文件格式:./当前文件名字

2.flags:文件权限(分为两种情况)

第一种:(只能选择并执行其中一个)

1、O_RDONLY 只读打开
 2、O_WRONLY 只写打开
3、O_RDWR 可读可写打开

当我们附带了权限后,打开的文件就只能按照这种权限来操作。以上这三个常数中应当只指定一 个。

第二种:(可以选择多种同时进行)

注:在执行第二种时,其格式是与第一种并在一起,两者中间需要加一个 '|'

1.O_CREAT:若文件不存在则创建它,使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。结构如下:(最后一部分代码可为此做展现)

fd = open("./file1",O_RDWR|O_CREAT,0600);//fd为open的文件描述符,如果没有该文件,则创建一个新的文件并打开

2.O_EXCL:如果同时指定了O_CREAT,而文件已经存在,则出错(返回-1)。结构如下:

fd=open("./file1",O_RDWR|O_CREAT|O_EXCL,0600);//fd为open返回的文件描述符,此时若已经存在file1,open返回-1

代码示例:

int main()
{int fd;fd = open("./file1",0 RDWRIO_CREATIO_EXCL,0600);if(fd == -1){printf("file cunZai\n");}return 0;
}//文件已经存在则会出错 返回值为-1 再针对-1做出验证

3.O_APPEND:每次写时都加到文件的尾端。结构如下:

fd=open("./file1",O_RDWR|O_APPEND);//此时可将原file1文件里的信息保留后再从尾部写入

代码示例:

int main()、
{int fd;char *buf = "Hello Word";fd = open(" ./file1",0_RDWR|O_APPEND);printf("open susceess : fd = %d\n",fd);int n_write = write(fd,buf,strlen(buf));if(n_write != -1){printf("write %d byte to fileln",n_write);}close(fd);return 0;
}//原先在文件里写入123456 执行上述代码后会在原先里面的123456后输出Hello Word

4.O_TRUNC属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0。结构如下:

fd=open("./file1",O_RDWR|O_TRUNC);//此时可将原file1文件里的信息先删除后写入
int main()、
{int fd;char *buf = "Hello Word";fd = open(" ./file1",0_RDWR|O_TRUNC);printf("open susceess : fd = %d\n",fd);int n_write = write(fd,buf,strlen(buf));if(n_write != -1){printf("write %d byte to fileln",n_write);}close(fd);return 0;
}//原先在文件里写入Hello Word,执行上述代码后文件会将原先里面的Hello Word替换成test

3.mode

mode是文件的创建模式,其执行功能有5种,分别是:

可执行:0100
可写:0200
可读:0400
可读、写:0600
可读、可写、可执行:0700

读的符号是r,数值为4;写的符号是w,数值为2;执行的符号是x,数值为1。其中共有4位数,而mode的创建模式执行的功能取决于第2位的数值(几种数值本身的数或者和)。对0600解析即:文件的所有者(用户)对文件file1的权限。

注:mode一定是在flags中使用了O CREAT标志,mode记录待创建的文件的访问权限。

文件描述符

执行一个程序时可能会打开很多文件,而对多个文件的操作需要进行区别,我们需要指定某个文件进行指定操作,这个时候就需要一个区分标志来辨别,即文件描述符。当一个文件被打开时,系统会产生一个结构体来储存文件中的各种信息,此时文件描述符指向这些信息。同时open函数的返回值就是一个文件描述符,其返回值是一个较小的非负整数

代码展示

文件存在:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>int main()
{int fd;//定义一个文件描述符fd = open("./file1",O_RDWR);//open函数的返回值给文件描述符printf("fd = %d\n",fd);//输出文件描述符的值return 0;
}

文件不存在:

创建(creat)

与open函数一样需包含以下三个头文件

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

creat的函数定义格式

int creat(const char *pathname,mode_t mode);

示例:

fd = creat("/home/CLC/file1",S IRWXU);//指定路径创建文件 并赋予权限
fd = creat("./file1",S IRWXU);//当前路径创建文件 并赋予权限

与open函数一样,返回值也是文字描述符。返回值也是一个较小的非负整数。

函数定义的参数解读

1.pathname:指向文件的路径

2.mode

mode是文件的创建模式,这里与open函数的mode有区别,这里的创建模式为系统自带。

可执行:S_IXUSR
可写:S_IWUSRL
可读:S_IRUSR
可读、可写、可执行:S_IRWXU

代码展示

结合open函数:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>int main()
{int fd;fd = open("./file1",O_RDWR);//此时文件已经不存在if(fd == -1)//文件不存在输出小于零的负数{printf("open file1 failed\n");//提示文件打开失败fd = open("./file1",O_RDWR|O_CREAT,0600);//创建一个可读可写可执行的文件if(fd > 0)//输出非负整数{printf("creat file1 success\n");//提示创建成功并打开}}return 0;
}

可见删除file1之后用该函数可以再次创建并打开。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CKA认证模块②-K8S企业运维和落地实战

CKA认证模块②-K8S企业运维和落地实战 Pod高级实战-Pod生命周期-启动钩子,停止钩子 Pod生命周期完整流程介绍 容器钩子; 容器探测; Pod重启策略; Pod的终止过程; Init容器; 初始化容器最佳实践 初始化容器与主容器区别是? init容器没有readinessProbe… [rootk8s-mast…

【机器学习】七、降维与度量学习

1. 维数灾难 样本的特征数称为维数&#xff08;dimensionality&#xff09;&#xff0c;当维数非常大时&#xff0c;也就是现在所说的维数灾难。 维数灾难具体表现在&#xff1a;在高维情形下&#xff0c;数据样本将变得十分稀疏&#xff0c;因为此时要满足训练样本为“密采样…

Postgres主键自增时重复键违反唯一约束

错误: 重复键违反唯一约束\"bue_new_copy1_pkey\"\n 详细&#xff1a;键值\"(id)(31)\"已经存在\n 新增的数据的id跟表里面的数据id重复了&#xff0c;这种一般是手动导入数据或者复制表等情况造成的&#xff0c;直接修改表的序列为当前最大的id&#xf…

25期代码随想录算法训练营第十四天 | 二叉树 | 递归遍历、迭代遍历

目录 递归遍历前序遍历中序遍历后序遍历 迭代遍历前序遍历中序遍历后序遍历 递归遍历 前序遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # …

python实现全向轮EKF_SLAM

python实现全向轮EKF_SLAM 代码地址及效果运动预测观测修正参考算法 代码地址及效果 代码地址 运动预测 简化控制量 u t u_t ut​ 分别定义为 v x Δ t v_x \Delta t vx​Δt&#xff0c; v y Δ t v_y \Delta t vy​Δt&#xff0c;和 ω z Δ t \omega_z \Delta t ωz…

【pytorch深度学习】使用张量表征真实数据

使用张量表征真实数据 本文为书pytorch深度学习实战的一些学习笔记和扩展知识&#xff0c;涉及到的csv文件等在这里不会给出&#xff0c;但是我会尽量脱离这一些文件将书本想要表达的内容给展示出来。 文章目录 使用张量表征真实数据1. 加载图像文件2. 改变布局3. 加载目录下…

自然语言处理(一):RNN

「循环神经网络」&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一个非常经典的面向序列的模型&#xff0c;可以对自然语言句子或是其他时序信号进行建模。进一步讲&#xff0c;它只有一个物理RNN单元&#xff0c;但是这个RNN单元可以按照时间步骤进行展开…

立冬特辑-----链表OJ题优选合集~~

目录 ​​​​​​​前言&#x1f333; 1.链表中倒数第k个结点&#x1f338; 1.1 思路 1.2 代码 2. 链表的回文结构&#x1fab8; 2.1 思路 2.2 代码 3.相交链表&#x1f32a;️ 3.1 思路 3.2 代码 4.环形链表I&#x1f30a;&#x1f6f3;️ 4.1 思路 4.2 代码 4…

Redis(三)

4、分布式锁 4.1 、基本原理和实现方式对比 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路 那么…

HTTP-FLV详解及分析

文章目录 前言一、HTTP-FLV 简介1、市场上使用 http-flv 的商家2、http-flv、rtmp 和 hls 直播的优缺点3、http-flv 技术实现 二、Nginx 配置 http-flv1、Windows 安装 nginx&#xff0c;已经集成 nginx-http-flv-module2、nginx.conf 配置文件3、运行 nginx 服务器4、ffmpeg 推…

FiRa标准——MAC实现(二)

在IEEE 802.15.4z标准中&#xff0c;最关键的就是引入了STS&#xff08;加扰时间戳序列&#xff09;&#xff0c;实现了安全测距&#xff0c;大大提高了测距应用的安全性能。在FiRa的实现中&#xff0c;其密钥派生功能是非常重要的一个部分&#xff0c;本文首先对FiRa MAC中加密…

MeterSphere 任意文件读取漏洞(CVE-2023-25814)

MeterSphere 任意文件读取漏洞&#xff08;CVE-2023-25814&#xff09; 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: title"MeterSphere" 漏洞复现1. 构造poc2. 发送数据包3. 查看文件 免责声明 仅用于技术交流,目的是向相关安全人员展示漏洞利用方式,以便更好地…