首页 > 代码库 > 通过fstat函数判断描述符类型

通过fstat函数判断描述符类型

fstat函数用于返回关于文件的信息到一个struct stat结构中,stat结构中的st_mode可以用来区分文件类型。


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 file system 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 */
           };


一些用来判断st_mode的宏

S_ISREG(m)  is it a regular file?

S_ISDIR(m)  directory?

S_ISCHR(m)  character device?

S_ISBLK(m)  block device?

S_ISFIFO(m) FIFO (named pipe)?

S_ISLNK(m)  symbolic link? (Not in POSIX.1-1996.)

S_ISSOCK(m) socket? (Not in POSIX.1-1996.)

示例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <stdlib.h>

main()
{
	struct stat st;
	int sockfd, fd;
	
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (sockfd == -1)
	{
		perror("socket error");
		exit(-1);
	}

	fd = open("/home/liyuchen/dev/net.h", O_RDWR);
	if (fd == -1)
	{
		perror("open error");
		exit(-1);
	}

	fstat(sockfd, &st);
	if (S_ISREG(st.st_mode))
		printf("文件描述符\n");
	if (S_ISSOCK(st.st_mode))
		printf("套接字描述符\n");

	fstat(fd, &st);
	if (S_ISREG(st.st_mode))
		printf("文件描述符\n");
	if (S_ISSOCK(st.st_mode))
		printf("套接字描述符\n");
}