线下实训
HOME
线下实训
正文内容
struct stat plc编程 Linux系统编程之文件系统和stat函数「62章节」
发布时间 : 2025-04-04
作者 : 小编
访问数量 : 23
扫码分享至微信

Linux系统编程之文件系统和stat函数「62章节」

Linux学习中,每天学习一点点,你就是下一个Linux专家

一、Linux系统编程之文件系统

文件系统需要了解相关概念:inode,dentry,数据存储,文件系统

Inode:

其本质为结构体,存储文件的属性信息,如权限,属性,时间,块位置....,也叫作文件属性管理结构

如下是文件和Inode和磁盘的存储关系:

dentry,inode和磁盘之间的关系

备注:磁盘空间不会被删除,格式化磁盘数据也无法删除,只能覆盖磁盘

Dentry:

Dentry一个文件名和一个inode,组合起来就是dentry,如上图

二、Stat函数

获取文件属性,(从Inode结构体中获取)

Int stat(const char *path, struct *buf);成功返回0;失败返回 -1设置errno 为恰当值。

参数1: 文件名

参数2:inode 结构体指针(传出参数)

文件属性将通过传出参数返回给调用者。

在 linux 输入 man stat 可以看到该函数的原型。

如下函数可以尝试看stat的用法

#include<unistd.h>

#include<stdlib.h>

#include<stdio.h>

#include<sys/stat.h>//需要引用此头文件

Int main(int argc, char *argv[]){

Strcut stat buf;

int ret = stat(argv[1], &buf);

If(ret == -1)

{

perror(“stat error”);

exit(1);

}

//如下打印stat各个属性,也可以获取其它文件属性

printf(“file size of=%ld\n”,buf.st_size); //获取文件大小

}

如下是struct stat的结构,可以通过上面的printf函数打印出来各个文件如下属性:

stat函数中struct *buf传出结构里的属性值

Linux下C函数库:glibc与newlibc

glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的 UNIX 通行的标准,可以想见其内容包罗万象。而就像其他的 UNIX 系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个操作系统。在 GNU/Linux 系统中,其C函式库发展史点出了GNU/Linux 演进的几个重要里程碑,用 glibc 作为系统的C函式库,是GNU/Linux演进的一个重要里程碑。

newlib c库是一个开源的c函数库,包括libc和libm两部分。它支持ANSI C库标准,针对不同处理器架构 进行优化,轻量级,适用于嵌入式 系统。

一. GLIBC

glibc是一种按照LGPL许可协议发布的C函数库,是程序运行时使用到的一些API集合,它们一般是已预先编译好,以二进制代码形式存在于Linux类系统中,glibc通常作为GNU C编译程序的一个部分发布。 它最初是自由软件基金会为其GNU操作系统所写,但目前最主要的应用是配合Linux内核,成为GNU/Linux操作系统一个重要的组成部分。

在通用的PC和Server中,Linux(ubuntu, Redhat, CentOS etc.)默认提供对glibc的支持;但是在嵌入式应用中,考虑到系统对os大小的要求和简化系统的复杂度等因素,并不一定支持glibc,而是支持uClibc、newLib等针对嵌入式应用的C函数库。这就要求在嵌入式系统开发的过程中,需要评估应用对glibc的依赖程度,评估程序开发或移植的工作量和复杂度。

glibc是linux系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,关于glibc功能的介绍可以在其官方网站上获取到详细的手册资料(http://www.gnu.org/software/libc/manual/)。

主要的功能如下(摘自glibc手册):

(1)Error Reporting,进行错误类型的检测和报告(how errors detected by the library are reported)

(2)Language Features, support for standard parts of the C language, including things like the sizeof operator and the symbolic constant NULL, how to write functions accepting variable numbers of arguments, and constants describing the ranges and other properties of the numerical types. There is also a simple debugging mechanism which allows you to put assertions in your code, and have diagnostic messages printed if the tests fail.

(3)Memory, 动态内存的分配和管理 (describes the GNU library's facilities for managing and using virtual and real memory, including dynamic allocation of virtual memory. If you do not know in advance how much memory your program needs, you can allocate it dynamically instead, and manipulate it via pointers.)

(4) 字符、字符串及数组的处理 Character Handling is about character classification functions (such as isspace) and functions for performing case conversion. String and Array Utilities, include functions for manipulating strings (null-terminated character arrays) and general byte arrays, including operations such as copying and comparison.

(5)标准IO的支持

(6)文件操作的支持(File System Interface, such as functions for deleting and renaming them and for creating new directories. also contains information about how you can access the attributes of a file, such as its owner and file protection modes. )

(7)进程间通讯的支持(Pipes and FIFOs, Pipes allow communication between two related processes (such as between a parent and child), while FIFOs allow communication between processes sharing a common file system on the same machine. )

(8)网络的支持(socket)

(9) 虚拟终端设备的管理,及系统的安全访问(Low-Level Terminal Interface, change the attributes of a terminal device. disable echo of characters typed by the user, for example, read this chapter. )

(10)数学及运算库的支持(定点运算和浮点库)

(11)查找和分类的支持(Searching and Sorting)

(12)模式匹配的支持(Pattern Matching)

(13)时间及定时器的管理

(14)不同字符集的编码转换

(15)国际化的支持,选择不同的语言种类和国家

(16)Non-Local Exits (provide a facility for goto-like jumps which can jump from one function to another.)

(17)信号量的支持(Signal Handling, establish a handler that is called when a particular kind of signal is delivered, and how to prevent signals from arriving during critical sections of your program.)

(18)进程编程和进程控制(process and Job control)

(19)用户管理和系统管理(User Database and System Management) 等

二. uClibc

uClibc 是一个面向嵌入式Linux系统的小型的C标准库。最初uClibc是为了支持uClinux而开发,这是一个不需要内存管理单元的Linux版本,因此适合于微控制器系统(uCs;此处"u"是代表"micro"的μ的罗马化).[2]

uClibc比一般用于Linux发行版的C库GNU C Library (glibc)要小得多,glibc目标是要支持最大范围的硬件和内核平台的所有C标准,而uClibc专注于嵌入式Linux.很多功能可以根据空间需求进行取舍。

uClibc运行于标准的以及无MMU的Linux系统上,支持tile, i386,x86 64,ARM (big/little endian), AVR32,Blackfin,h8300,m68k,MIPS (big/little endian), PowerPC,SuperH (big/little endian), SPARC,和v850等处理器。

uClibc和Glibc并不相同,两者有许多不同之处,而且以下不同有可能给你带来一些问题.

1.uClibc比Glibc小,虽然uClibc和Glibc在已有的接口上是兼容的,而且采用uClibc编译应用程序比采用Glibc编译应用程序要更方便,但是uClibc并没有包括Glibc中的所有接口实现,因此有些应用可能在uClibc中不能编译。

2.uClibc在可配置性上比Glibc要好。

3.uClibc并不能保证发布的库二进制兼容旧版本uClibc库。当一个新的版本uClibc库被发布,则可能需要也可能不需要重新编译应用程序。

4.uClibc没有提供用于数据接口的库(libdb)。

5.uClibc不支持NSS(/lib/libnss_*),在这方面Glibc更容易支持不同方式的认证和DNS解析。uClibc仅仅支持采用flat口令文件或者shadow口令文件存储授权信息。如果需要比这些更复杂的的授权,可以编译安装pam。

6.uClibc中的libresolv库仅仅是一个桩。Glibc的libresolv库中的部分并不是全部的功能uClibc都提供,许多函数都没有实现。

7.提供网络信息服务支持(NIS)libnsl库(最初被称为黄页YP),被SUN扩展为发明为RPC并用于网络共享Unix口令文件

。个人认为NIS是一个令人厌恶的东西并应该使用。因此,在实现相同的功能情况下采用ldap比NIS更有效。uClibc虽然提供一个桩libnsl,但并不支持NIS。我们因此也不提供在Glibc下提供的位于/usr/include/rpcsvc里的头文件。

8.uClibc的区域支持并不是100%的完全。正在这方面努力

9.uClibc的数据功能函数库内部仅仅支持long double,设置对于long double的支持也是非常有限。与此对应的只实现了较少的数学函数。如果应用程序采用double类型,则会程序会运行得较好。

10.uClibc的libcrpt库不支持可重入crypt_r,setkey_r和encrypt_r,因为这些也不是SuSv3所规定的。

11.uClibc直接采用内核的数据类型去定义大多数透明的数据类型。

12.uClibc支持采用linux内核结构特有的结构体"struct stat"。

13.uClibc的运行时库librt当前缺少aio接口、全部的时钟接口和共享内存接口(仅仅实现定时器接口和消息队列接口)

三. newlib

Newlib是一个面向嵌入式系统的C运行库。最初是由Cygnus Solutions收集组装的一个源代码集合,取名为newlib,现在由Red Hat维护。

对于与GNU兼容的嵌入式C运行库,Newlib并不是唯一的选择,但是newlib是比较优秀和成熟度比较高的一个。newlib具有独特的体系结构,使得它能够非常好地满足深度嵌入式系统的要求。newlib可移植性强,具有可重入特性、功能完备等特点,已广泛应用于各种嵌入式系统中。

newlib 是一个用于嵌入式系统的开放源代码的C语言程序库,由libc和libm两个库组成,特点是轻量级,速度快,可移植到很多CPU结构上。newlib实现了许多复杂的功能,包括字符串支持,浮点运算,内存分配(如malloc)和I/O流函数(printf,fprinf()等)。其中libc提供了c 语言库的实现,而libm提供了浮点运算支持。

在使用gcc编译器时,对gcc指定不同的配置选项时,使用的C语言库就不同,默认情况是下使用glibc,可以通过--with-newlib选择使用newlib.

相关问答

linux下C语言怎么获取文件创建时间?-成天花钱的富婆的回答...

可以通过stat来读取文件,2113就可以获取到相关的文5261件4102信息。charbuf[65];structstat;stat("c:\\test.txt",&sb...

怎么样获得计算机的机器码?-ZOL问答

void(CALLBACK*ncb_post)(struct_NCB*);UCHARncb_lana_num;UCHARncb_...NCBASTAT接受本地或远程接口卡的状态。...

linux中read如何从文件读取数据?

可以使用如下代码来实现:注意:以下实例省略了错误处理。#include//writePersonzhang3;memset((void*)&zhang3,0x00,sizeo...

怎么让linux重新枚举pci设备-ZOL问答

#definePCICFG_REG_STAT0x06/*Statusregister,2bytes*/#definePCICFG_REG_RID0x08/*Revisioni...

大神们有谁能解答一下吗,青少年编程、少儿编程优势。?

[回答]格式转换有很多种。必须说清楚是什么格式之间的转换才可以实现编程。例如bmp转化为jpeg格式。例程:/********************************************...

什么是共享存储空间,就是有的笔记本是共享存储空间,多大啊?共...

status0x0000000065536root6003932162dest0x000000002654209root66...structshmid_ds*buf);...

 仟佰惠彩妆  东莞南城汽车总站 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2025  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部