`

linux c学习笔记----文件的属性(access,stat,fstat)

阅读更多

access(判断是否具有存取文件的权限)

 


相关函数
stat,open,chmod,chown,setuid,setgid
表头文件
#include<unistd.h>
定义函数
int access(const char * pathname,int mode);
函数说明
access()会检查是否可以读/写某一已存在的文件。参数mode有几种情况组合,R_OK,W_OK,X_OK 和F_OK。R_OK,W_OK与X_OK用来检查文件是否具有读取、写入和执行的权限。F_OK则是用来判断该文件是否存在。由于access()只作权限的核查,并不理会文件形态或文件内容,因此,如果一目录表示为“可写入”,表示可以在该目录中建立新文件等操作,而非意味此目录可以被当做文件处理。例如,你会发现DOS的文件都具有“可执行”权限,但用execve()执行时则会失败。
返回值
若所有欲查核的权限都通过了检查则返回0值,表示成功,只要有一权限被禁止则返回-1。
错误代码
EACCESS 参数pathname 所指定的文件不符合所要求测试的权限。
EROFS 欲测试写入权限的文件存在于只读文件系统内。
EFAULT 参数pathname指针超出可存取内存空间。
EINVAL 参数mode 不正确。
ENAMETOOLONG 参数pathname太长。
ENOTDIR 参数pathname为一目录。
ENOMEM 核心内存不足
ELOOP 参数pathname有过多符号连接问题。
EIO I/O 存取错误。
附加说明
使用access()作用户认证方面的判断要特别小心,例如在access()后再做open()的空文件可能会造成系统安全上的问题。
范例
/* 判断是否允许读取/etc/passwd */
#include<unistd.h>
int main()
{
if (access(“/etc/passwd”,R_OK) = =0)
printf(“/etc/passwd can be read\n”);
}
执行
/etc/passwd can be read

stat(取得文件状态)


相关函数
fstat,lstat,chmod,chown,readlink,utime
表头文件
#include<sys/stat.h>
#include<unistd.h>
定义函数
int stat(const char * file_name,struct stat *buf);
函数说明

stat()用来将参数file_name所指的文件状态,复制到参数buf所指的结构中。
下面是struct stat内各参数的说明
struct stat
{
dev_t st_dev; /*device*/
ino_t st_ino; /*inode*/
mode_t st_mode; /*protection*/
nlink_t st_nlink; /*number of hard links */
uid_t st_uid; /*user ID of owner*/
gid_t st_gid; /*group ID of owner*/
dev_t st_rdev; /*device type */
off_t st_size; /*total size, in bytes*/
unsigned long st_blksize; /*blocksize for filesystem I/O */
unsigned long st_blocks; /*number of blocks allocated*/
time_t st_atime; /* time of lastaccess*/
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
};

st_dev 文件的设备编号
st_ino 文件的i-node
st_mode 文件的类型和存取的权限
st_nlink 连到该文件的硬连接数目,刚建立的文件值为1。
st_uid 文件所有者的用户识别码
st_gid 文件所有者的组识别码
st_rdev 若此文件为装置设备文件,则为其设备编号
st_size 文件大小,以字节计算
st_blksize 文件系统的I/O 缓冲区大小。
st_blcoks 占用文件区块的个数,每一区块大小为512 个字节。
st_atime 文件最近一次被存取或被执行的时间,一般只有在用mknod、utime、read、write与tructate时改变。
st_mtime 文件最后一次被修改的时间,一般只有在用mknod、utime和write时才会改变
st_ctime i-node最近一次被更改的时间,此参数会在文件所有者、组、权限被更改时更新先前所描述的

 

 

st_mode 则定义了下列数种情况
S_IFMT 0170000 文件类型的位遮罩
S_IFSOCK 0140000 scoket
S_IFLNK 0120000 符号连接
S_IFREG 0100000 一般文件
S_IFBLK 0060000 区块装置
S_IFDIR 0040000 目录
S_IFCHR 0020000 字符装置
S_IFIFO 0010000 先进先出
S_ISUID 04000 文件的(set user-id on execution)位
S_ISGID 02000 文件的(set group-id on execution)位
S_ISVTX 01000 文件的sticky位
S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限
S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限
S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限


上述的文件类型在POSIX 中定义了检查这些类型的宏定义
S_ISLNK (st_mode) 判断是否为符号连接
S_ISREG (st_mode) 是否为一般文件
S_ISDIR (st_mode)是否为目录
S_ISCHR (st_mode)是否为字符装置文件
S_ISBLK (s3e) 是否为先进先出
S_ISSOCK (st_mode) 是否为socket

若一目录具有sticky 位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名。

返回值
执行成功则返回0,失败返回-1,错误代码存于errno
错误代码
ENOENT 参数file_name指定的文件不存在
ENOTDIR 路径中的目录存在但却非真正的目录
ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT 参数buf为无效指针,指向无法存在的内存空间
EACCESS 存取文件时被拒绝
ENOMEM 核心内存不足
ENAMETOOLONG 参数file_name的路径名称太长
范例
#include<sys/stat.h>
#include<unistd.h>
mian()
{
struct stat buf;
stat (“/etc/passwd”,&buf);
printf(“/etc/passwd file size = %d \n”,buf.st_size);
}
执行
/etc/passwd file size = 705

 

fstat(由文件描述词取得文件状态)

 


相关函数
stat,lstat,chmod,chown,readlink,utime
表头文件
#include<sys/stat.h>
#include<unistd.h>
定义函数
int fstat(int fildes,struct stat *buf);
函数说明
fstat()用来将参数fildes所指的文件状态,复制到参数buf所指的结构中(struct stat)。Fstat()与stat()作用完全相同,不同处在于传入的参数为已打开的文件描述词。详细内容请参考stat()。
返回值
执行成功则返回0,失败返回-1,错误代码存于errno。
范例
#include<sys/stat.h>
#include<unistd.h>
#include<fcntk.h>
main()
{
struct stat buf;
int fd;
fd = open (“/etc/passwd”,O_RDONLY);
fstat(fd,&buf);
printf(“/etc/passwd file size +%d\n “,buf.st_size);
}
执行
/etc/passwd file size = 705
分享到:
评论

相关推荐

    Linux学习笔记Linux学习资料Linux教程

    【linux学习笔记--17】...【linux学习笔记-3】文件操作(stat,chmod,umask).doc 【linux学习笔记-4】进程扇和进程链.doc 【linux学习笔记-5】编写自己的ls命令.doc 【linux学习笔记-6】文件IO操作--读写、重定向等.

    非常宝贵的LINUX学习笔记

    【linux学习笔记-3】文件操作(stat,chmod,umask) 【linux学习笔记-4】进程扇和进程链 【linux学习笔记-5】编写自己的ls命令 【linux学习笔记-6】文件IO操作--读写、重定向等 【linux学习笔记-7】用户标识UID与有效...

    linux学习笔记-01linux操作基础

    ### Linux学习笔记—01 Linux操作基础 #### 1. Linux 基础命令与用法 在Linux操作系统中,掌握一系列的基础命令是非常重要的。这些命令可以帮助用户进行各种日常操作,比如文件管理、目录切换、文件查看等。下面将...

    Linux下C语言编程--文件的操作

    根据提供的信息,我们可以详细探讨 Linux 下 C 语言编程中关于文件操作的相关知识点。这包括文件的创建、读写、属性管理、目录文件操作以及管道文件等主题。 ### 1. 文件的创建和读写 #### 系统调用 `open` `open...

    Linux下C语言编程--文件操作.rar_c 五子棋_c++ 写文件 linux_linux shell_linux c_

    在Linux系统中,C语言是基础且强大的编程工具,它提供了丰富的函数库来处理文件操作。本教程将探讨如何在Linux环境下使用C语言进行文件的读取、写入、显示目录以及创建目录等常见操作。 首先,让我们了解C语言中的...

    mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz.7z

    glibc(GNU C Library)是Linux上的主要C库,提供了许多系统调用和低级接口。 在Linux环境下安装MySQL 5.7.30,你需要遵循以下步骤: 1. **解压**: 首先,你需要使用7-Zip工具解压7z格式的文件,然后使用tar命令...

    Linux下C语言编程--线程操作

    ### Linux下C语言编程——线程操作 #### 前言:Linux下线程的创建与基础使用 在Linux环境中,线程作为一种重要的并发机制,为开发者提供了在单个进程中执行多个任务的能力。相较于进程,线程之间的切换成本更低,...

    postgresql-10.12-1-linux-x64-binaries.tar.gz

    标题中的"postgresql-10.12-1-linux-x64-binaries.tar.gz"指示了这是PostgreSQL 10.12.1版本的Linux 64位二进制文件包,通常用于在Linux环境中安装该数据库系统。 **PostgreSQL 10.12版本的关键特性:** 1. **多...

    Linux实验七:LinuxC-编程-文件与目录.doc

    通过这些实验,学习者可以深入理解Linux系统中的文件操作,包括标准输入输出的使用、文件的复制以及查看文件属性的方法。这些基本技能对于进行Linux系统编程至关重要,也常常是编写系统工具和应用程序的基础。

    方舟编译器工具openarkcompiler - clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz2

    放置到`openarkcompiler/tools`目录,打开`openarkcompiler/build/config/BUILDCONFIG.gn`文件,将`GN_C_COMPILER`、`GN_CXX_COMPILER`和`GN_AR`三个变量配置为Clang编译器所在路径,例如: ``` GN_C_COMPILER = "$...

    postgresql-10.15-1-linux-x64-binaries.tar.gz

    这个"postgresql-10.15-1-linux-x64-binaries.tar.gz"文件是专为Linux系统设计的PostgreSQL 10.15版本的64位二进制安装包。它包含了运行、管理和维护PostgreSQL数据库所需的所有核心组件和工具。 1. **PostgreSQL...

    cudnn-linux-x86-64-8.6.0.163-cuda11-archive.zip

    标题 "cudnn-linux-x86-64-8.6.0.163-cuda11-archive.zip" 暗示了我们正在处理一个针对Linux操作系统,x86_64架构的CUDA深度神经网络库(CuDNN)的压缩包。CuDNN是由NVIDIA开发的用于加速深度学习应用程序的库,它与...

    postgresql-10.19-1-linux-x64-binaries.tar.gz

    标题中的"postgresql-10.19-1-linux-x64-binaries.tar.gz"是指PostgreSQL 10.19版本的64位Linux二进制文件的压缩包,适用于x86_64架构的Linux系统。 这个压缩包包含了运行和管理PostgreSQL数据库所需的所有核心组件...

    stat.xslnginx-rtmp-module-stat.xsl

    stat.xslnginx-rtmp-module-stat.xsl conf/nginx.conf 为配置文件实例 RTMP监听 1935 端口,启用live 和hls 两个application HTTP监听 8080 端口, * :8080/stat 查看stream状态 * :8080/index.html 为一个...

    LINUX下c语言读取文件信息

    总之,在Linux下用C语言读取文件信息,主要涉及`&lt;sys/stat.h&gt;`头文件中的`stat()`函数,通过它获取的`struct stat`结构体包含了丰富的文件属性。理解并熟练运用这些函数对于进行系统级编程和文件管理至关重要。在yjl...

    fstat、stat和lstat异同

    stat系统调用系列包括了fstat、stat和lstat,它们都是用来返回“相关文件状态信息”的,三者的不同之处在于设定源文件的方式不同。

    linux命令笔记-4

    Linux操作系统提供了多种方法来实现开机自动运行脚本,这些方法对于自动化运维和系统管理非常有用。以下是关于在Linux中设置开机自启动脚本的详细知识: 1. **使用`crontab`** `crontab`是Linux下的定时任务调度...

    uni-stat依赖文件

    在uni-app框架中,uni-stat是一个专门用于实现这一目标的依赖文件。uni-app是一个多端开发框架,能够支持iOS、Android、H5、小程序等多个平台,而uni-stat则是uni-app生态中的数据分析工具,主要用于小程序的数据...

    redis-stat 离线安装

    标题 "redis-stat 离线安装" 涉及到的是在没有网络或者网络环境受限的情况下,如何安装和使用 `redis-stat` 这一工具。`redis-stat` 是一个用于监控 Redis 数据库性能的工具,它能提供实时的统计信息,帮助管理员...

    linux 系统命令 ls -l命令的实现

    这个命令的实现涉及到对Linux内核系统调用的使用,如`stat()` 和 `readdir()`,以及C语言编程技术。下面将详细介绍`ls -l`命令的实现原理和相关知识点。 1. 文件系统接口: `ls -l` 的实现首先需要访问文件系统...

Global site tag (gtag.js) - Google Analytics