linux/unix文件描述符

论文Agile Autonomy: Learning High-Speed Flight in the Wild开源代码运行记录 ​ Agile Autonomy: Learning High-Speed Flight in the Wild Learning High-Speed Flight in the Wild 论文链接:https://www.science.org/doi/10.1126/scirobotics.abg5810 代码:https://github.com/uzh-rpg/agile_autonomy 国内复现:https://github.com/Howardcl/AgileAutonomyPX4 阅读详情
#include <sys/stat.h>
#include<types.h>
int stat(const char*pathname, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);

 
参数说明:
pathname 带路径的文件名
buf            第二个参数是个指针,它指向一个我们应提供的结构

 
给予一个pathname,stat函数返回一个与此命名文件有关的信息结构,fstat函数获得已在描述符filedes上打开的文件的有关信息。 lstat函数类似于stat,但是当命名的文件是一个符号连接时,lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。lstat函数不属于POSIX10031-1990标准,但很可能加到10031a中。SVR4和4.3+BSD支持lstat。
 
第二个参数是个指针,它指向一个我们应提供的结构。这些函数填写由buf指向的结构。该结构的实际定义可能所实施而有所不同,但其基本形式是:
     

struct stat{
        mode    st_mode;       /*文件类型和方式(许可数)*/
        ino        st_ino;            /* i-节点号(序列号)*/
        dev       st_dev;           /*设备号(文件系统)*/
        dev       st_rdev;          /*特殊文件的设备号*/
        nlink      st_nlink;         /*连接数*/
        uid       st_uid;            /*属主的用户ID*/
        gid       st_gid;            /*属主的组ID*/
        off              st_size;           /*普通文件的字节长度*/
        time      st_atime;        /*最后存取时间*/
        time      st_mtime;       /*最后修改存取时间*/
        time      st_ctime;        /*最后文件状态更改时间*/
        long      st_blksize;      /*最佳I/O块长*/
        long      st_blocks;       /*分配的512字节块块数
        };


POSIX.1未定义stdevstksige和stblocks字段。SVR4和4.3+BSD则定义了这些字段。注意,除最后两个以外,其它各成员都为基本系统数据类型。我们将说明此结构的每个成员以了解文件属性。stat函数的最大用户很可能是ls-l命令,用其可以获得有关一个文件的所有信息。
 
文件类型
至今我们已介绍了两种不同的文件类型--普通文件和目录。Unix系统的大多数文件是普通文件或目录,但是也有另外一些文件类型:
1.普通文件(Regular file)。[S_IFREG] 这是最常见的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据对于系统核而言并无区别。对普通文件内容的解释由处理该文件的应用程序进行。

2.目录文件(Directory file)。[S_IFDIR]这种文件包含了其它文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读许可数的任一进程都可以读该目录的内容,但只有系统核可以写目录文件。
3.字符特殊文件(Charocter special file)。[S_IFCHR]这种文件用于系统中的某些类型的设备。
4.块特殊文件(Block special file)。[S_IFBLK]这种文件典型地用于磁盘设备。系统中的所有设备或者是字符特殊文件,或者是块特殊文件。
5.FIFO。[S_IFFIFO]这种文件用于进程间的通信,有时也将其称为命名管道。
6.套接口(socket)。[S_IFSOCK]这种文件用于进程间的网络通信。套接口也可用于在一台宿主机上的进程之间的非网络通信。在第十五章,我们将用套接口进行进程间的通信。只有4.3+BSD才返回套接口文件类型,虽然 SVR4支持用套接口进行进程间通信,但现在是经由套接口函数库实现的,而不是通过系统核内的套接口文件类型,将来的SVR4版本可能会支持套接口文件类型。
7.符号连接(Symboliclink)。[S_IFLNK]这种文件指向另一个文件。


文件类型信息,包含在stat结构的stode成员中。我们可以用宏确定文件类型。这些宏的参数都是stat结构中的stode成员。
相关的宏判断如下:

S_ISREG(buf.st_mode)
S_ISBLK(buf.st_mode)
S_ISCHR(buf.st_mode)
S_ISDIR(buf.st_mode)
S_ISFIFO(buf.st_mode)
S_ISLNK(buf.st_mode)
S_ISSOCK(buf.st_mode)

 
以下实例为模拟ls –l命令的功能

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>


////测试文件类型,并转化为UNIX标识方式
int GetFileType(mode_t st_mode, char *resp)
{
  if (resp == NULL) return 0;
  if (S_ISDIR(st_mode)) resp[0] = 'd';                /* 测试是否为目录文件 */
  else if (S_ISCHR(st_mode))  resp[0]='c';         /* 测试是否为字符文件 */
  else if (S_ISBLK(st_mode))  resp[0]='b';         /* 测试是否为块文件 */
  else if (S_ISREG(st_mode))  resp[0]='-';         /* 测试是否为普通文件 */
  else if (S_ISFIFO(st_mode)) resp[0]='p';        /* 测试是否为管道文件 */
  else if (S_ISLNK(st_mode))  resp[0]='l';         /* 测试是否为符合链接 */
  else resp[0] = ' ';
 

 return 1;
}

 
////测试文件权限,并转化为UNIX标识方式
int GetFileMode(mode_t st_mode, char *resp)
{
   if (resp == NULL) return 0;
  memset(resp, '-', 9);
  if (st_mode & S_IRUSR) resp[0] = 'r';
  if (st_mode & S_IWUSR) resp[1] = 'w';
  if (st_mode & S_IXUSR) resp[2] = 'x';
  if (st_mode & S_IRGRP) resp[3] = 'r';
  if (st_mode & S_IWGRP) resp[4] = 'w';
  if (st_mode & S_IXGRP) resp[5] = 'x';
  if (st_mode & S_IROTH) resp[6] = 'r';
  if (st_mode & S_IWOTH) resp[7] = 'w';
  if (st_mode & S_IXOTH) resp[8] = 'x';  

  return 9;
}

 
//////测试文件其它属性式
int GetFileOtherAttr(struct stat info, char *resp)
{
  struct tm * mtime;
  if (resp == NULL) return 0;
  mtime = localtime(&info.st_mtime);
  return (sprintf(resp, " %3d %6d %6d %11d %04d%02d%02d",
  info.st_nlink, info.st_uid, info.st_gid, info.st_size,
  mtime->tm_year+1900, mtime->tm_mon+1, mtime->tm_mday));
}

 
//////////////////主函数///////////
void main(int argc, char **argv)
{
  struct stat info;
  char buf[100], *p = buf;
  if (argc != 2)
  {
    fprintf(stderr, "ls1 filename/n");
    return ;
  }
  memset(buf, 0, sizeof(buf));
  if (lstat(argv[1], &info) == 0)
  {
    p += GetFileType(info.st_mode, p);
    p += GetFileMode(info.st_mode, p);
    p += GetFileOtherAttr(info, p);
    printf("%s %s/n", buf, argv[1]);
  }
  else fprintf(stderr, "open file failed./n");
}

 
C#上位机+国产PLC+AI:构建自主可控的智能生产线解决方案 全栈国产化智能产线方案并非遥不可及,基于成熟的国产硬件、丰富的.NET生态、快速发展的国产大模型,完全可以搭建出稳定可靠且具备智能能力的生产系统。落地建议采用三步走策略:基础国产化阶段:替换PLC与上位机,实现基础监控与控制功能,解决卡脖子问题,快速验证国产化方案稳定性数据沉淀阶段:完善数据采集与存储,建立设备台账、故障库、工艺库,积累高质量领域数据智能升级阶段:引入国产大模型与知识库,落地故障诊断、工艺优化、预测性维护等智能应用,持续提升产线效率。 阅读详情

相关推荐

Windows下CMake编译VTK

选择项目INSTALL,生成该项目,得到vtk在Debug模式下的lib和dll文件,在文件夹中可看见,已得到debug模式下lib库与dll库。,把Value值设置为最后在vtk_sln中生成include、dll、lib的位置。在上面点击Configure后,红色区域没有了。选择自己vs编译平台的版本信息,我这边已经设置好了没有这个设置了,借用参考博客的图片。设置完后,点击左下角"Configure",然后等待Configure。,把搜索结果的Value勾选上。在search中搜索。

weixin_74239923的博客 842

UNIX再学习 -- 文件描述符

在 UNIX/Linux 系统中,一切皆文件,这句话想必都有听过。对于文件的操作几乎适用于所有的设备,这也就看出了文件操作的重要性了。在C语言再学习部分有讲过标准I/O文件操作,参看:C语言再学习 -- 文件 下面我们来讲解下系统文件I/O的。

不积跬步,无以至千里 1万+

海康工业相机 Could not find module MvCameraControl.dll(已解决)

【代码】海康摄像机 Could not find module MvCameraControl.dll(已解决)

hmbbpdx的博客 2223

UNIX环境高级编程_文件IO_文件描述符

记录了unix环境高级编程书中,文件Io章节的文件描述符。

weixin_43916755的博客 719

区块链技术在碳足迹数据存证与溯源中的应用深度解析

消费者扫描产品上的二维码,即可通过区块链浏览器查询到该产品的数字碳标签,并追溯其从茶园到货架的每一步碳足迹数据,以及这些数据是如何被智能合约自动计算和认证的,从而建立起强大的品牌信任。如果说哈希链解决了数据的“存”与“证”的问题,那么智能合约则解决了数据“用”与“管”的自动化问题。综上所述,虽然针对“碳足迹数据可追溯性”这一特定应用场景的公开、标准化的性能基准案例尚不丰富,但现有研究和企业级解决方案(特别是联盟链)已经证明,通过合理的技术选型和架构设计,区块链的性能可以满足实际商业需求。

百态·数智思维 | 聚焦大数据、量化与未来AI 1106

记一次使用STM32F042K6芯片内部HSI48M时钟导致CAN总线报错问题

深入去解决某个问题时,也会加深你对其它部分的了解和思考,比如这里让我又重新了解和CAN的采样点和CAN报错机制。

ApexYuan 860

unix文件描述符

文件描述符 简称fd,unix内核对所有打开的文件,使用fd进行引用,fd表现为一个递增的非负整数。 所谓“打开的文件”并不一定是指我们通常理解的文本文件,可能是个设备文件,或是socket。在unix中一切皆文件,文件是一个泛称。 文件描述符具有以下性质: 每个进程具有自己的fd递增空间。已关闭的fd所占用的正整数是可能被重复利用的。...

weixin_33847182的博客 697

三维重建之条纹投影结构光(三)——相高模型标定

接上面两文: 三维重建之条纹投影结构光(一)https://blog.youkuaiyun.com/beyond951/article/details/123361852?spm=1001.2014.3001.5501三维重建之条纹投影结构光(二)——四步相移+三频外差法https://blog.youkuaiyun.com/beyond951/article/details/123769596?spm=1001.2014.3001.5501接下来对相高模型进行标定,其推导过程如下图所示 ...

beyond951的博客 4876

Unix 文件描述符详解:从内核管理到 IO 复用的核心载体

文件描述符(File Descriptor)是 Unix 和类 Unix 操作系统(如 Linux)中 I/O 操作的核心概念。它是一个非负整数(例如 $0$, $1$, $2$ 分别对应标准输入、标准输出和标准错误),用于标识打开的文件、管道、套接字或设备等资源。文件描述符作为用户空间和内核之间的桥梁,不仅简化了 I/O 访问,还支持高效的 I/O 复用机制。下面,我将从内核管理入手,逐步解析其工作原理,并延伸到 I/O 复用的应用,确保内容真实可靠。文件描述符是一个轻量级句柄,由系统调用(如 、)返回。

2501_93878622的博客 798

Python爬虫实战:从巨潮网批量抓取上市公司年报JSON数据

网络爬虫作为自动化数据采集的核心技术,其原理是通过模拟浏览器行为向服务器发送HTTP请求并解析响应,从而高效获取结构化信息。在金融数据分析领域,这项技术价值尤为突出,能够将研究人员从繁琐的手工数据收集中解放出来,聚焦于更高阶的模型构建与价值挖掘。典型的应用场景包括上市公司财务研究、市场趋势分析和风险预警系统开发。本文以Python的requests库为核心工具,详细解析如何通过分析巨潮资讯网的JSON数据接口,构建一个稳定、高效的上市公司年报数据采集管道,并重点探讨了接口逆向、分页爬取、PDF文件下载等关键

weixin_42529366的博客 1236

YOLOv8改进 | Conv篇 | DWRSeg扩张式残差助力小目标检测 (附修改后的C2f+Bottleneck)

本文内容给大家带来的DWRSeg中的DWR模块来改进YOLOv8中的C2f和Bottleneck模块,主要针对的是小目标检测,主要创新点可以总结如下:多尺度特征提取机制的深入研究和创新的DWR模块和SIR模块的提出这种方法使得网络能够更灵活地适应不同尺度的特征,从而更准确地识别和分割图像中的物体。通过本文你能够了解到DWRSeg的基本原理和框架,并且能够在你自己的网络结构中进行添加(DWRSeg需要增加一定的计算量一个DWR模块大概增加0.4GFLOPs)。

Snu77的博客 9572

fstat、stat和lstat 区别(转)

 stat系统调用系列包括了fstat、stat和lstat,它们都是用来返回“相关文件状态信息”的,三者的不同之处在于设定源文件的方式不同。1 首先隆重介绍的是一个非常重要的”VIP”人物,他是fstat, stat和lstat三者都要用到的一个结构体类型,名字叫做struct stat。可以说,没有这个struct stat的支持,上述三个系统调用将寸步难行。这个struct st

chenji001的专栏 2277

【论文精读】《Towards Deep Learning Models Resistant to Adversarial Attacks》

本文探讨了深度学习模型在面对对抗性攻击时的脆弱性,并提出了一种基于鲁棒优化的方法来增强神经网络的对抗鲁棒性。通过鞍点优化框架,作者提供了对抗攻击和防御机制的统一视角,并在MNIST和CIFAR-10数据集上验证了其方法的有效性。对抗训练的核心思想是将对抗样本引入训练过程,使模型能够学习到对抗样本的特征,从而提升其鲁棒性。本文通过鞍点优化框架提出了一种基于鲁棒优化的对抗训练方法,显著提升了深度学习模型的对抗鲁棒性。本文为深度学习模型的对抗鲁棒性研究提供了新的理论和实证支持,同时为未来研究指明了方向。

nmdbbzcl的博客 611

理解Unix/Linux系统中的文件描述符

文件描述符是针对Unix/Linux的每个进程而言的,每个进程都维护了一个文件指针表,指针指向操作系统的文件。这里的文件是指的Unix/Linux系统所说的文件,Unix/Linux下一切皆文件。文件描述符相当于一个文件指针表的下标,进程通过下标指针进行间接寻址,从而在操作系统的内核中寻找自己的资源。对于任意进程,默认的文件0、1、2分别表示标准输入、标准输出、标准错误。 因此,对于进程来说,拿到...

Erick Lv的笔记 847

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

mysql 文件描述符_【翻译自mos文章】在unix/linux中使用文件描述符(FileDescripto

在unix/linux中使用文件描述符(File Descriptors)来找回被删掉的文件(数据文件or redo log) 参考原文: Retrieve deleted files on Unix / Linux using File Descriptors (Doc ID 444749.1) 适用于: Oracle Database - Enterprise Edition - Versio...

weixin_32350433的博客 165

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

linux清理db2表空间,UNIX/Linux中的文件描述符 && 为何删除DB2的容器之后表空间仍然可以访问...

大多数UNIX文件I/O只需用到5个函数open,read,write,lseek,close。当使用open或者create函数打开或创建一个新文件时,内核向进程返回一个文件描述符,文件描述符是一个非负整数(也就是open/create函数的返回值,如果小于0,则出错)。当读、写文件时,read/write函数使用参数的是文件描述符,而非文件名。UNIX/LINUX shell中,文件描述符0代...

weixin_39999532的博客 119

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Unix/Linux文件描述符与缓冲区管理深度解析

文件描述符是Unix/Linux系统中重要的I/O抽象机制,它通过统一的数字接口实现对各类资源的访问控制。从技术原理看,内核通过文件描述符表、打开文件表等多层结构实现资源隔离与共享。这种设计不仅降低了系统组件耦合度,还使得进程间通信、零拷贝传输等高级功能成为可能。在实际工程中,合理设置缓冲区大小(如SSD推荐64-256KB)和同步策略(fsync/fdatasync)对性能至关重要。通过procfs、sysfs等伪文件系统,开发者可以文件化方式获取CPU、内存等硬件信息,这正是Unix'一切皆文件'哲学的

weixin_34302798的博客 694

linux如何删除表空间文件,UNIX/Linux中的文件描述符 && 为何删除DB2的容器之后表空间仍然可以访问...

大多数UNIX文件I/O只需用到5个函数open,read,write,lseek,close。当使用open或者create函数打开或创建一个新文件时,内核向进程返回一个文件描述符,文件描述符是一个非负整数(也就是open/create函数的返回值,如果小于0,则出错)。当读、写文件时,read/write函数使用参数的是文件描述符,而非文件名。UNIX/LINUX shell中,文件描述符0代...

weixin_35060159的博客 218

(转)关于unix/linux系统中的文件描述符fd

一、文件描述符和路径指定文件的区别 在unix/linux系统中,文件描述符的作用就是标识已经打开的文件(注意Linux中所有的I/O设备都是以文件的方式访问!),注意,是已经打开的文件,并不包括没有打开的文件。所以,用文件描述符fd来指定一个文件,就意味着该文件已经被打开。而用路径名来指定一个文件,该文件既可以是打开的,也可以是未打开的。 按照上名的解释,你就能很容易的明白以下几个函数之间的...

forhope的专栏 359

linux open函数头文件,unix/linux 编程学习笔记- 文件描述符和 open 函数

最近更新:26th 4月, 2015来说一说 unix/linux中对于文件操作的这几个函数,这几个函数基本上可以满足我们对于 linux 中任何文件的需求,首先说一说 open这个函数在 linux 中要对文件进行操作都要先相应的将文件打开然后在处理,为什么要这么做呢?那是因为进程和文件在之间不可以直接操作,要想进程对文件操作首先要用系统调用在进程和文件之间简历一条连接,这个连接成为文件描述符,...

weixin_35874865的博客 724

Unix/Linux编程:复制文件描述符

引入 Bourne shell 的 I/O 重定向语法 2>&1,意在通知 shell 把标准错误(文件描述符 2)重定向到标准输出(文件描述符 1)。因此,下列命令将把(因为 shell 按从左至右的顺序处理 I/O 重定向语句)标准输出和标准错误写入 result.log 文件 $ ./myscrpt > results.logs 2>&1 shell 通过复制文件描述符 2实现了标准错误的重定向操作,因此文件描述符 2 与文件描 述符 1 指向同一个打开文件句柄(类

OceanStar的博客 693

理解Unix/Linux中的错误重定向:文件描述符的作用

在Unix/Linux中,文件描述符是一个非负整数,用于标识打开的文件或数据流。0:标准输入(stdin)——用于接收输入数据。1:标准输出(stdout)——用于输出正常信息。2:标准错误(stderr)——用于输出错误信息。

2501_91107759的博客 323

Linux/Unix文件IO(文件描述符、原子操作、文件数据结构、open、read、write、fcntl、dup)

本文介绍了文件IO操作的两种方式:系统调用IO和标准IO。系统调用IO(如open、read、write等)是操作系统的底层接口,直接与内核交互但性能开销较大。标准IO在此基础上提供缓冲机制,减少系统调用次数。文章还深入探讨了原子操作实现、文件描述符的三层数据结构(描述符表、文件表、v-node表)以及文件控制函数fcntl和文件描述符复制函数(dup/dup2/dup3)的使用。这些机制共同保证了文件操作的高效性和数据一致性。

weixin_43192805的博客 1030

Unix/Linux编程:文件描述符与exec()

默认情况下,由exec()的调用程序所打开的文件描述符在exec()的执行过程中会保持打开状态,而且在新进程中依然有效。这通常很实用,因为调用程序可能会以特定的描述符来打开文件,而在新程序中这些文件将自动有效,无需再去了解文件名或是把它们重新打开。 shell 利用这一特性为其所执行的程序处理 I/O 重定向。例如,假设键入如下的 shell 命令: $ ls /tmp > dir.txt $ ls dir.txt shell运行该命令时,执行了以下步骤: 调用fork()创建子进程,子进程也会运

OceanStar的博客 660

【翻译自mos文章】在unix/linux中使用文件描述符(File Descriptors)来找回被删掉的文件(数据文件or redo log)

在unix/linux中使用文件描述符(File Descriptors)来找回被删掉的文件(数据文件or redo log)

msdnchina的专栏@JiNan,ShanDong 1583

UNIX/Linux中的文件描述符 && 为何删除DB2的容器之后表空间仍然可以访问

大多数UNIX文件I/O只需用到5个函数open,read,write,lseek,close。当使用open或者create函数打开或创建一个新文件时,内核向进程返回一个文件描述符,文件描述符是一个非负整数(也就是open/create函数的返回值,如果小于0,则出错)。当读、写文件时,read/write函数使用参数的是文件描述符,而非文件名。UNIX/LINUX shell中,文件描述符0代

匿_名_用_户的专栏 1113
上一篇: 静态链接库与动态链接库
下一篇: unix下的低级文件操作
comlc
博客等级 码龄19年 9粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值