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"); }
通过fstat函数判断描述符类型
时间: 2024-12-17 04:39:23