波奇学Linux: 文件描述符

文件和操作系统的关系

操作系统控制进程,文件的打开是在进程中进行。意味着用来控制进程的PCB必然有文件的信息,操作系统通过控制PCB的信息来控制文件的读写。

Q1:如何证明文件打开是在进程中进行?

编写c文件调用fopen来操作文件,c文件会被编译成可执行程序执行,即进程,实现进程中对文件操作。

C的文件操作和系统调用

文件调用必须通过系统调用

fopen,fclosed等库函数是用户接口,从硬盘读取文件时,对硬件操作时,必须调用操作系统的函数底层

文件操作库函数和底层函数的关系 

c文件操作库函数主要有fopen,fclose等

其中fopen第一个参数是文件名,第二个参数是打开模式

r:只读

r+:可读可写

w:只写,清空再写

w+:可读可写,清空再写,文件不存在创建

a:只写,追加写

a+:可读可读写,追加写

系统调用则用open函数 

 

其中 open函数中的 flags参数表示选项, mode表示文件权限

flags参数表示文件操作读,写,可读可写,参数是宏

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
//设置掩码为0
umask(0);
//创建只写文件,如果文件不存在时创建,新文件掩码是0666
int fd=open("log.txt",O_CREAT|O_WRONLY,0666); 
// 关闭文件
fclose(fd);
return 0;
}

因此我们可以推断 fopen的w+模式 必然是对open的封装,且对应的宏参数为O_WRONLY|O_CREAT|O_TRUNC

而不同的模式对应不同的宏参数组合。

宏参数控制的方法叫做比特位控制法

#define ONE (1<<0)
#define TWO (1<<1)
#define THREE (1<<2)
#define FOUR (1<<3)
void show(int flags)
{
if (flags&ONE) printf("hello function1");
if (flags&TWO) printf("hello function2");
if (flags&THREE) printf("hello function3");
if (flag&FOUR) printf("hello function4");
}
int main()
{
show(ONE);
ShoW(TWO);
show(ONE|THREE); // function3 和function1都打印
return 0;
}

 文件调用本质

在task_struct的指针中有files_struct的指针

files_struct结构体含有一个数组,数组中有file*指针,数组的下标就是fd,open的返回值file descriptor。

fd为1和为2都指向显示器文件,用引用计数解决这个问题。

file指针管理着文件,包含基本信息

关闭文件就是引用计数减一,同时释放file结构体

在Linux下一切皆文件

fd=0 stdin流,对应键盘文件

fd=1 stdout流 对应显示器文件

fd=2 stderr 显示器文件

向fd为1的文件,即向显示器输出hello Linux。

C语言的FILE* 必然会封装fd

同理库函数的printf等调用fd为1的文件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——单向链表和双向链表的实现(C语言版)

目录 前言 1. 链表 1.1 链表的概念及结构 1.2 链表的分类 2. 单链表接口实现 2.1 数据结构设计与接口函数声明 2.2 创建结点&#xff0c;打印&#xff0c;查找 2.3 尾插&#xff0c;头插&#xff0c;尾删&#xff0c;头删 2.4 插入或删除 2.4.1在指定位置后 2.4.2在…

OpenCV-34 顶帽操作和黑帽操作

一、顶帽操作&#xff08;TOPHAT&#xff09; 顶帽 原图 - 开运算 开运算的效果是去除图像外的噪点&#xff0c;因此原图 - 开运算就得到了去掉的噪点。 通过API --- morphologyEx&#xff08;img&#xff0c; MORPH_TOPHAT&#xff0c; kernel&#xff09; 示例代码如下&…

C++基础知识点预览

一.绪论&#xff1a; 1.1 C简史&#xff1a; 与C的关系&#xff1a; 被设计为C语言的继任者&#xff0c;C语言是一种过程型语言&#xff0c;程序员使用它定义执行特定操作的函数&#xff0c;而C是一种面向对象的语言&#xff0c;实现了继承、抽象、多态和封装等概念。C支持类&…

Spring Boot 笔记 004 自动配置和自定义starter

003讲到了导入jar包中的方法&#xff0c;但其实是个半成品&#xff0c;别人写的jar包中的方法我要在自己的代码中去调用&#xff0c;非常的不方便。原则上写给别人用的jar包&#xff0c;人家要能直接用&#xff0c;而不用写注入的方法。 在springboot中会自动扫描imports文件中…

【FFmpeg】ffplay 命令行参数 ⑤ ( 设置音频滤镜 -af 参数 | 设置统计信息 -stats 参数 | 设置同步时钟类型 -sync 参数 )

文章目录 一、ffplay 命令行参数 - 音频滤镜1、设置音频滤镜 -af 参数2、常用的 音频滤镜 参数3、音频滤镜链 示例 二、ffplay 命令行参数 - 统计信息1、设置统计信息 -stats 参数2、关闭统计信息 -nostats 参数 三、ffplay 命令行参数 - 同步时钟类型1、设置同步时钟类型 -syn…

从Socket中解析Http协议实现通信

在网络协议中&#xff0c;Socket是连接应用层和运输层的中间层&#xff0c;主要作用为了通信。Http协议是应用层上的封装协议。我们可以通过Http协议的规范解析Socket中数据&#xff0c;完成Http通信。 首先&#xff0c;我们先回顾一下Http协议的规范。主要复习一下&#xff0c…

YOLOv8改进 | 检测头篇 | 独创RFAHead检测头超分辨率重构检测头(适用Pose、分割、目标检测)

一、本文介绍 本文给大家带来的改进机制是RFAHead,该检测头为我独家全网首发,本文主要利用将空间注意力机制与卷积操作相结合的卷积RFAConv来优化检测头,其核心在于优化卷积核的工作方式,特别是在处理感受野内的空间特征时。RFAConv主要的优点就是增加模型的特征提取能力,…

【web前端开发】HTML及CSS简单页面布局练习

案例一 网页课程 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…

Linux中ps/kill/execl的使用

ps命令&#xff1a; ps -aus或者ps -ajx或者 ps -ef可以查看有哪些进程。加上 | grep "xxx" 可以查看名为”xxx"的进程。 ps -aus | grep "xxx" kill命令&#xff1a; kill -9 pid 杀死某个进程 kill -l 查看系统有哪些信号 execl函数&#…

在Ubuntu上部署Stable Video Diffusion动画制作

Stable Diffusion团队推出的开源模型Stable Video Diffusion&#xff0c;支持生成约3秒的视频&#xff0c;分辨率为5761024。通过测试视频展示了其令人瞩目的性能&#xff0c;SVD模型是一个生成图像到视频的扩散模型&#xff0c;通过对静止图像的条件化生成短视频。其特点主要包…

Vue源码系列讲解——虚拟DOM篇【三】(更新子节点)

1. 前言 在上一篇文章中&#xff0c;我们了解了Vue中的patch过程&#xff0c;即DOM-Diff算法。并且知道了在patch过程中基本会干三件事&#xff0c;分别是&#xff1a;创建节点&#xff0c;删除节点和更新节点。创建节点和删除节点都比较简单&#xff0c;而更新节点因为要处理…

使用cocos2d-console初始化一个项目

先下载好cocos2d-x的源码包 地址 https://www.cocos.com/cocos2dx-download 这里使用的版本是 自己的电脑要先装好python27 用python安装cocos2d-console 看到项目中有个setup.py的一个文件 python setup.py 用上面的命令执行一下。 如果执行正常的话回出现上面的图 然后…

教师如何找答案? #知识分享#职场发展

当今社会&#xff0c;随着信息技术的迅猛发展&#xff0c;大学生们在学习过程中面临着各种各样的困难和挑战。而在这些挑战中&#xff0c;面对繁重的作业和复杂的题目&#xff0c;大学生搜题软件应运而生 1.快解题 这是一个网站 是一款服务于职业考证的考试搜题软件,拥有几千…

CVE-2018-19518 漏洞复现

CVE-2018-19518 漏洞介绍 IMAP协议&#xff08;因特网消息访问协议&#xff09;它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息&#xff0c;下载邮件等。它运行在TCP/IP协议之上&#xff0c;使用的端口是143。在php中调用的是imap_open函数。 PHP 的…

特征工程:数据平衡

目录 一、前言 二、正文 Ⅰ.基于过采样算法 Ⅱ.基于欠采样算法 Ⅲ..基于过采样和欠采样的综合算法 三、结语 一、前言 大多数情况下&#xff0c;使用的数据集是不完美的&#xff0c;会出现各种各样的问题&#xff0c;尤其针对分类问题的时候&#xff0c;会出现类别不平衡的…

可达鸭二月月赛——基础赛第六场(周五)题解,这次四个题的题解都在这一篇文章内,满满干货,含有位运算的详细用法介绍。

姓名 王胤皓 T1 题解 T1 题面 T1 思路 样例输入就是骗人的&#xff0c;其实直接输出就可以了&#xff0c;输出 Hello 2024&#xff0c;注意&#xff0c;中间有一个空格&#xff01; T1 代码 #include<bits/stdc.h> using namespace std; #define ll long long int …

机器学习---学习与推断,近似推断、话题模型

1. 学习与推断 基于概率图模型定义的分布&#xff0c;能对目标变量的边际分布&#xff08;marginal distribution&#xff09;或某些可观测变量 为条件的条件分布进行推断。对概率图模型&#xff0c;还需确定具体分布的参数&#xff0c;称为参数估计或学习问 题&#xff0c;…

MATLAB环境下一维时间序列信号的同步压缩小波包变换

时频分析相较于目前的时域、频域信号处理方法在分析时变信号方面&#xff0c;其主要优势在于可以同时提供时域和频域等多域信号信息&#xff0c;并清晰的刻画了频率随时间的变化规律&#xff0c;已被广泛用于医学工程、地震、雷达、生物及机械等领域。 线性时频分析方法是将信…

第十七篇【传奇开心果系列】Python的OpenCV库技术点案例示例:自适应阈值二值化处理图像提取文字

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文目录前言一、自适应阈值二值化处理图像提取文字轮廓的初步示例代码:二、扩展思路介绍三、调整自适应阈值二值化的参数示例代码四、对二值化图像进行形态学操作示例代码五、使用轮廓特征进行筛选示…

Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(三)

八、ui窗体创建要点 .h文件定义(popwindowf.h)&#xff0c; TEST_TYPE_WINDOW宏是要创建的窗口样式。 #pragma once #include <gtk/gtk.h> G_BEGIN_DECLS #define TEST_TYPE_WINDOW (test_window_get_type()) G_DECLARE_FINAL_TYPE (TestWindow, test_window, TEST, WI…