Linux 下stat和access函数

1.stat既有命令也有同名函数,用来获取文件Inode里主要信息(即文件类型、文件权限、创建/修改/访问时间等就是ls -l看到的相关的信息),stat 跟踪符号链接,lstat不跟踪符号链接。可以通过man 2 stat查看相关的信息。

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

int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);

struct stat {
               dev_t     st_dev;     /* ID of device containing file */
               ino_t     st_ino;     /* inode number */
               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 ID (if special file) */
               off_t     st_size;    /* total size, in bytes */
               blksize_t st_blksize; /* blocksize for filesystem I/O */
               blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
               time_t    st_atime;   /* time of last access */
               time_t    st_mtime;   /* time of last modification */ //指的是修改文件内容
               time_t    st_ctime;   /* time of last status change */ //指的是修改inode属性
            };
#include <sys/types.h>
#include <sys/stat.h>
#include<time.h>
#include <unistd.h>
#include<errno.h>
#include<stdio.h>

int main(int argc, char *argv[])
{
	struct stat filestat;
	if (argc < 2)
	{
		printf("Usage: %s <pathname>\n", argv[0]);
		return 0;
	}
	if (stat(argv[1], &filestat) == -1)
	{
		perror("stat error:");
		return 0;
	}

	printf("File type:                ");

	switch (filestat.st_mode & S_IFMT)// 0170000   bit mask for the file type bit fields
	{
	case S_IFBLK:
		printf("block device\n");
		break;
	case S_IFCHR:
		printf("character device\n");
		break;
	case S_IFDIR:
		printf("directory\n");
		break;
	case S_IFIFO:
		printf("FIFO/pipe\n");
		break;
	case S_IFLNK:
		printf("symlink\n");
		break;
	case S_IFREG:
		printf("regular file\n");
		break;
	case S_IFSOCK:
		printf("socket\n");
		break;
	default:
		printf("unknown?\n");
		break;
	}

	printf("I-node number:            %ld\n", (long) filestat.st_ino);

	printf("Mode:                     %lo (octal)\n",
			(unsigned long) filestat.st_mode);

	printf("Link count:               %ld\n", (long) filestat.st_nlink);
	printf("Ownership:                UID=%ld   GID=%ld\n", (long) filestat.st_uid,
			(long) filestat.st_gid);

	printf("Preferred I/O block size: %ld bytes\n", (long) filestat.st_blksize);
	printf("File size:                %lld bytes\n", (long long) filestat.st_size);
	printf("Blocks allocated:         %lld\n", (long long) filestat.st_blocks);

	printf("Last status change:       %s", ctime(&filestat.st_ctime));
	printf("Last file access:         %s", ctime(&filestat.st_atime));
	printf("Last file modification:   %s", ctime(&filestat.st_mtime));

	return 0;
}

2.access函数

功 能: 确定文件或文件夹的访问权限。即,检查某个文件的存取方式,比如说是只读方式、只写方式等。如果指定的存取方式有效,则函数返回0,否则函数返回-1。

#include <unistd.h>
int access(const char *pathname, int mode);

按实际用户ID和实际组ID测试,跟踪符号链接

参数mode

R_OK 是否有读权限

W_OK 是否有写权限

X_OK 是否有执行权限

F_OK 测试一个文件是否存在

#include<stdio.h>
#include<unistd.h>

int main(int argc, char *argv[])
{
	if (argc < 2)
	{
		printf("Usage: %s <pathname>\n", argv[0]);
		return 0;
	}
	if(access(argv[1],R_OK|X_OK|W_OK)==0)
	{
		printf("read wirte execute \n");
	}
	return 0;
}

版权声明:欢迎转载,如有不足之处,恳请斧正。

时间: 2024-08-29 01:54:34

Linux 下stat和access函数的相关文章

linux 下getch()函数实现

//调用 //char *ptr = (char *)malloc(sizeof(char) * 128); //ptr = get_passwd(); //printf("\n"); #include<stdio.h> #include<termios.h> #include<unistd.h> #include<assert.h> #include<string.h> #include <stdlib.h> i

linux下c++filter查看函数修饰名

c++函数在linux系统下编译之后会变成类似下面的样子: _ZNK4Json5ValueixEPKc 在linux命令行使用c++filter: [email protected]:~ $ c++filt _ZNK4Json5ValueixEPKc Json::Value::operator[](char const*) const 这样就得到函数的原始名称 如果没有安装c++filter, 可以自行搜索.linux下c++filter查看函数修饰名,布布扣,bubuko.com

Linux Linux下特殊的printf函数

Linux下,printf函数必须以'\n'结尾才会立刻输出到屏幕,如果没有'\n'直到输出缓冲区满了以后才会打印到屏幕上(敲击换行也算),如果需要不换行的输出,一般可以使用write函数代替.'\n'有清空缓存的作用

Linux下c编程rename函数导致的问题

前段时间在部署代码的时候,发现一个比较"诡异"的问题 相同的环境下(CentOs 6.5),开发说在其本机的虚拟机汇总测试是正常的,部署到正式环境中时,就会出现问题.相同的函数,总是执行失败.在另一台测试也是完全正常 开发说是服务器安装的原因,来来回回安装了N次.真TM郁闷 然后又说是权限的问题,包的问题,自己安装,服务器拿回家升级,重买服务器.这个拿回去给他妈用等等等等--我都懒的理他 首先说权限问题,我说跟测试正常的那台机器完全相同,说不行,好吧,给你777 又说是包没安装,我说那

Linux下的select 与函数

Select    循环与菜单 它的主要用于创建菜单,按数字排列顺序的菜单项将呈现出列表的形式显示在标准错误输出上,并显示PS3提示符请求用户输入(默认时,PS3的值为"#?").心啊是PS3提示符后,shell等待用户输入,输入的应当是菜单列表中的一个数字,输入值会保存在一个shell的特殊变量REPLY中国,它与选项列表中相应的括号后面的字符串相关联. case命令和select命令联合使用时,用户可以从菜单中进行选择,并基于选项执行相应的命令. 1)select 格式 selec

linux下confstr与uname函数_获取C库与内核信息

#include <stdio.h> #include <sys/utsname.h> //uname int main(int argc, char **argv[]) { struct utsname u; if (uname(&u) != -1) { printf("获取当前内核的名称和信息例如以下\n" "sysname:%s\n" "nodename:%s\n" "release:%s\n&qu

linux下getrlimit与sysconf函数

#include <stdio.h> #include <sys/time.h> #include <sys/resource.h> int main(int argc, char *argv[]) { struct rlimit nofile_rlmt; if (getrlimit(RLIMIT_NOFILE, &nofile_rlmt) != -1) { printf("获取进程最大能打开的文件描写叙述符个数信息:\n" "rl

linux下awk内置函数的使用(split/substr/length)

一.split 初始化和类型强制  awk的内建函数split允许你把一个字符串分隔为单词并存储在数组中.你可以自己定义域分隔符或者使用现在FS(域分隔符)的值.格式: split (string, array, field separator)   split (string, array)  -->如果第三个参数没有提供,awk就默认使用当前FS值. 例1:替换分隔符 time="12:34:56" out=`echo $time | awk '{split($0,a,&qu

[RK_2014_0918]linux下,测试usleep函数对CPU占用率的影响

一.本机环境 CPU信息 Intel(R) Core(TM) i3 CPU M 350 @ 2.27GHz Intel(R) Core(TM) i3 CPU M 350 @ 2.27GHz Intel(R) Core(TM) i3 CPU M 350 @ 2.27GHz Intel(R) Core(TM) i3 CPU M 350 @ 2.27GHz 内存信息MemTotal: 1990228 kB 二.搭建测试代码 1.测试代码 #include <iostream> #include &l