lienhua34
2014-09-01

1 文件类型

我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型:

(1) 普通文件(regular file)

这种文件包含了某种形式的数据,这些数据无论是文件还是二进制对于 UNIX 内核而言都是一样的。对普通文件内容的解释有处理该文件的应用程序进行。

(2) 目录文件(directory file)

目录文件包含了其他文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读权限的任一进程都可以读取该目录的内容,但是只有内核才能直接写目录文件。

(3) 块特殊文件(block special file)

这种文件类型提供对设备带缓冲的访问,每次访问以固定长度为单位进行。

(4) 字符特殊文件(character special file)

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

(5) FIFO

这种类型文件用于进程间通信。也称为命名管道(namedpipe)。

(6) 套接字(socket)

这种文件类型用于进程间的网络通信。

(7) 符号链接(symbolic link)

这种文件类型指向另一个文件。

我们如何判断一个文件的文件类型呢?我们可以先通过stat函数获取文件的属性信息,然后从其属性信息中判断该文件的文件类型。

2 获取文件属性信息的stat函数

UNIX系统提供了三个 stat 函数以获取文件的属性信息,包括文件类型、所有者、大小和修改时间等。

#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);

三个函数返回值:若成功则返回0,若出错则返回-1.

stat 函数获取与命名文件有关的信息结构。fstat 函数获取已在文件描述符filedes 上打开的文件的有关信息。lstat 函数类似于 stat 函数,但是当命名的文件是一个符号链接时,lstat 返回该符号链接的有关信息,而不是由该符号链接引用文件的信息。

第二个参数 buf 是指针,指向一个 struct stat 结构。这些函数填写由buf 指向的结构。struct 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 specail files */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 allocate */
}

3 判断文件类型

文件类型信息包含在 stat 结构的st_mode 成员中。可以使用下表 1 中的宏来确定文件类型。这些宏的参数都是 stat 结构的st_mode 成员。

表 1: <sys/stat.h> 中的文件类型宏
文件类型
S_ISREG() 普通文件
S_ISDIR() 目录文件
S_ISCHR() 字符特殊文件
S_ISBLK() 块特殊文件
S_ISFIFO() 管道或 FIFO
S_ISLNK() 符号链接
S_ISSOCK() 套接字

下面程序取其命令行参数,然后针对每个命令行参数打印其文件类型。

#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
int
main(int argc, char *argv[])
{int i;struct stat buf;char *ptr;for (i=0; i < argc; i++) {printf("%s: ", argv[i]);if (lstat(argv[i], &buf) < 0) {printf("lstat error: %s\n", strerror(errno));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 = "** nuknown mode **";}printf("%s\n", ptr);}    exit(0);
}

编译该程序,生成文件 filetype,然后运行 filetype 文件,

lienhua34:demo$ gcc -o filetype filetype.c
lienhua34:demo$ ./filetype /etc/passwd /etc /dev/initctl /dev/log /dev/tty
./filetype: regular
/etc/passwd: regular
/etc: directory
/dev/initctl: lstat error: No such file or directory
/dev/log: socket
/dev/tty: character special

(done)

UNIX环境编程学习笔记(6)——文件I/O之判断文件类型相关推荐

  1. UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数

    lienhua34 2014-09-16 1 文件的时间 每个文件都有三个时间字段,如表 1 所示. 表 1: 文件的三个时间字段 说明 字段 st_atime 文件数据的最后访问时间 st_mtim ...

  2. UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习

    在"进程控制三部曲"中,我们学习到了 fork 是三部曲的第一部,用于创建一个新进程.但是关于 fork 的更深入的一些的东西我们还没有涉及到,例如,fork 创建的新进程与调用进 ...

  3. UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数...

    lienhua34 2014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序).对于 ...

  4. UNIX环境编程学习笔记(1):——出错处理errno

    lienhua34 2014 年 8 月 24 日 1. errno变量 文件 <errno.h> 中定义了符号 errno 以及可以赋予它的各种常量,这些常量都是以字符 E 开头.例如, ...

  5. UNIX环境编程学习笔记(25)——信号处理进阶学习之 sigaction 函数

    lienhua34 2014-11-05 sigaction 函数跟 signal 函数一样,用于设置信号处理函数.此函数是用于取代 UNIX 早期版本使用的 signal 函数.UNIX 早期版本的 ...

  6. 5w字总结 Unix系统编程学习笔记(面试向)(Unix环境高级编程/Unix环境程序设计)

    文章目录 一.计算 C语言的数据表示与处理 计算 C语言的基本运算操作 内存表和符号表 类型转换 函数类型的分析 指令 复合指令 句法 函数 函数激活(Activation Record) 函数激活定 ...

  7. UNIX网络编程学习笔记(代码超详细解析)(持续更新)

    1. 其他函数准备 1. TCP 回射服务器程序: str_echo 函数 #include "unp.h"void str_echo(int sockfd) {ssize_t n ...

  8. 2021版!万字UNIX网络编程学习笔记(套接字篇)

    目录 1.一个简单的时间获取服务器的程序 2.套接字篇 2.1 套接字简介 2.2 套接字中常用的函数 2.3 基本TCP套接字编程 2.3.1.socket函数 2.3.2 connect函数 2. ...

  9. Unix网络编程学习笔记之第11章 名字与地址转换

    一. 域名系统(DNS) 1. 简介 DNS主要用于主机名和IP地址之间的映射. 主机名可以是简单的名字ljm,也可以是全限定域名ljm.localdomainbaidu.com等. 2.资源记录 D ...

最新文章

  1. 按下回车键指向下一个位置的一个函数
  2. [scala-spark]6. 继承与特质trait
  3. 一文搞懂 SQL:基础知识和业务实践总结
  4. 智能实验室-全能优化(Guardio) 4.0.0.670 beta 8
  5. Docker最全教程——从理论到实战(三)
  6. 速领,我给大家做了程序员专属红包封面~
  7. NeurIPS 2020 | 腾讯 AI Lab 解读机器学习及计算机视觉方向入选论文
  8. 如何 Scale Up/Down 应用?- 每天5分钟玩转 Docker 容器技术(126)
  9. 扇贝有道180902每日一句
  10. 小米无线网卡linux驱动下载,Linux下安装MT7601U无线网卡驱动
  11. 计算机32还是64位操作系统,电脑系统32位好还是64位好 哪个快?
  12. ZZNU 2125:A + B 普拉斯(傻逼题+大数加法)
  13. Simplest NodeJS server
  14. Chrome浏览器默认全屏启动(非--kiosk模式)
  15. 记公司同事的一次集体活动
  16. Fritzing软件绘制Arduino面包板接线图传感器模块库文件273
  17. android 视频直播SDK
  18. 单例模式(中):单例模式的弊端
  19. 移动互联网:让健康做主
  20. [Matlab]切比雪夫Ⅰ型滤波器设计:低通、高通、带通和带阻(2)

热门文章

  1. python3菜鸟教程中文-Python3 日期和时间
  2. Uva 507 - Jill Rides Again(最大子数组求和问题)
  3. 网络编程学习笔记(服务器端进程终止)
  4. 监控视频长度压缩算法
  5. Restful设计相关
  6. java设计模式-建造者模式
  7. 个人站立会议(11月17日)
  8. Hadoop综合大作业补交4次作业:获取全部校园新闻,网络爬虫基础练习,中文词频统计,熟悉常用的Linux操作...
  9. 2018.3.31 设计模式之生成器模式详解及例子(对象创建型模式)
  10. Linux一键安装PHP/JAVA环境OneinStack