Linux Advance--打印文件类型

文件相关的信息存放在结构体 stat 中:

struct stat {
	mode_t		st_mode;	/* file type & mode (permissions) */
	ino_t		st_ino;		/* i-node number (serial number) */
	dev_t		st_dev;		/* device number (file system) */
	dev_t		st_rdev;	/* device number for special file */
	nlink_t		st_nlink;	/* number of links */
	uid_t		st_uid;		/* user ID of owner */
	gid_t		st_gid;		/* group ID of owner */
	off_t		st_size;	/* size in bytes, for regular files */
	time_t		st_atime;	/* time of last access */
	time_t		st_mtime;	/* time of last modification */
	time_t		st_ctime;	/* time of last file status change */
	blksize_t	st_blksize;	/* best I/O block size */
	blkcnt_t	st_blocks;	/* number of disk blocks allocated */
};

与此相关的函数声明如下:

#include <sys/stat.h>

int stat(const char *restrict pathname, struct stat *restrict buf);

int fstat(int filedes, struct stat *buf);

int lstat(const char *restrict pathname, struct stat *restrict buf);

下面介绍Linux的基本文件类型:

1、普通文件 (regular file)

2、目录文件 (directory file)

3、块特殊文件 (block special file):这种文件类型提供对设备带缓冲的访问,每次访问以固定长度为单位进行。

4、字符特殊文件 (character special file):这种文件类型提供对设备不带缓冲的访问,每次访问长度可变。系统中的所有设备要么是字符特殊文件,要么是块特殊文件。

5、FIFO:这种类型作用于进程间通信,有时也将其称为命名管道(named pipe)。

6、套接字 (socket):这种文件类型作用于进程间的网络通信。

7、符号链接 (symbolic link):这种文件类型指向另一个文件。


文件类型包含在 stat 结构的 st_mode 成员中,下面是文件类型宏:

S_ISREG()	普通文件
S_ISDIR()	目录文件
S_ISCHR()	字符特殊文件
S_ISBLK()	块特殊文件
S_ISFIFO()	管道或FIFO
S_ISLNK()	符号链接
S_ISSOCK()	套接字


这里我们用 lstat 读取文件的信息,更多关于 stat 的信息可以点此查看,下面是代码:

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

int main(int argc, char *argv[])
{
    int			i;
    struct stat buf;
    char 		*ptr;

    for (i=1; i<argc; i++) {
		printf("%s: ", argv[i]);
		if (lstat(argv[i], &buf) < 0) {
			printf("lstat error\n");
			continue;
		}
		if (S_ISREG(buf.st_mode))
			ptr = "regular";
		else if (S_ISDIR(buf.st_mode))
			ptr = "directory";
		else if (S_ISCHR(buf.st_mode))
			ptr = "character special";
		else if (S_ISBLK(buf.st_mode))
			ptr = "block special";
		else if (S_ISFIFO(buf.st_mode))
			ptr = "fifo";
		else if (S_ISLNK(buf.st_mode))
			ptr = "symbolic link";
		else if (S_ISSOCK(buf.st_mode))
			ptr = "socket";
		else
			ptr = "** unknown mode **";
		printf("%s\n", ptr);
    }
	exit(0);
}

实验结果如下:



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值