文件与I/O(三)
获取文件信息
代码实现
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<errno.h>
#include<string.h>
#define ERROR_EXIT(m) (perror(m),exit(EXIT_FAILURE))
#define MAJOR(a) (int)((unsigned short)a>>8)
#define MINOR(a) (int)((unsigned short)a & 0xFF)
int filetype(struct stat * buf);
int main(int argc, char* argv[])
{
if(argc!=2){
fprintf(stderr,"usger %s file\n",argv[0]);
exit(EXIT_FAILURE);
}
printf("filename:%s\n",argv[1]);
struct stat buf;
if(stat(argv[1],&buf)==-1)
ERROR_EXIT("stat error");
printf("File number:major %d,minor %d,inode %d\n",MAJOR(buf.st_dev),MINOR(buf.st_dev),\
buf.st_ino);
filetype(&buf);
printf("Mode: %lo (octal)\n",
(unsigned long) buf.st_mode & 0777);
return 0;
}
int filetype(struct stat* buf){
printf("filetype:");
int flag=0;
mode_t mode;
mode=buf->st_mode;
switch(mode & S_IFMT){
case S_IFSOCK:
printf("socket\n");
break;
case S_IFLNK:
printf("symbolic link\n");
break;
case S_IFREG:
printf("regular file");
break;
case S_IFBLK:
printf("block device\n");
flag=1;
break;
case S_IFDIR:
printf("directory\n");
break;
case S_IFCHR:
printf("character device\n");
flag=1;
break;
case S_IFIFO:
printf("FIFO");
break;
}
return flag;
}
运行结果:
主设备号:决定系统用什么驱动程序访问设备