Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42138
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 101
  • 用 户 组: 普通用户
  • 注册时间: 2015-07-16 20:46
文章分类
文章存档

2015年(10)

分类: LINUX

2015-11-20 20:30:59

在linux这个一切皆文件的世界中,对文件的理解很是重要,自己将apue中的文件类型总结了以下,希望对大家有所帮助。

一. linux下文件系统大概包括普通文件,目录文件,块特殊文件,字符特殊文件,FIFO,套接字,符号链接七种。
(1). 普通文件(regular file):
a. linux下最常用的文件类型,该类文件可以是文本文件或者二进制文件,两者对unix内核来说并无具体区别。

(2). 目录文件(directory file):
a. 该类文件信息中包含了其他文件的名字以及指向这些文件的指针。

b. 目录文件的读写权限有点特殊:
--> 当任意一个进程对该目录享有读权限时,他都可以读到该目录的内容。
--> 但只有内核对目录可以直接进行写操作,进程必须通过APUE第四章介绍的函数才可以更改目录信息。

(3). 块特殊设备(blocks special file):
a. 块设备提供对设备(磁盘等)带缓冲的访问,每次访问以固定长度为单位进行。
b. FreeBSD不再支持块设备,而是以(4)文件类型对待。

(4). 字符特殊文件(character special file):
a. 字符特殊文件与块特殊文件都是描述设备的文件类型。
b. 相对于块特殊设备,该类型为不带缓冲访问。
c. 每次访问长度可以改变。
d. 系统中所有的设备都属于(3), (4)。

(5). FIFO(有名管道named pipe):
a. 用于进程间通信。
b. 传送门:http://blog.csdn.net/riyadh_linux/article/details/49826543


(6). 套接字(socket):
a. 用于进程间网络通信或者一台宿主机上进程间的非网络通信。

(7). 符号链接(symbolic link):
a. 符号链接分为软链接和硬链接,软链接相当于windows下的快捷方式;而硬链接则相当于拷贝动作,并且回同步时间戳。

二. 类型操作:
(1). 上述个文件类型都包含在stat结构的st_mode成员中(传送门:http://blog.csdn.net/riyadh_linux/article/details/49935819)。文件类型可以用以下宏来确定:

点击(此处)折叠或打开

  1. 宏           文件类型
  2. S_ISREG()    普通文件
  3. S_ISDIR()    目录文件
  4. S_ISCHR()    字符特殊文件
  5. S_ISBLK()    块特殊文件
  6. S_ISFIFO()   管道或FIFO文件
  7. S_ISLINK()   符号链接
  8. S_ISSOCK()   套接字

  9. 其参数都是stat结构中st_mode成员。
  10. <sys/stat.h>中的文件的类型宏
POSIX.1允许将进程间通信说明为文件,所以我们可以用stat来确定IPC对象的类型:

点击(此处)折叠或打开

  1. S_TYPEISMQ() 消息队列
  2. S_TYPEISSEM() 信号量
  3. S_TYPEISSHM() 共享内存对象

  4. 其参数不是stat中st_mode成员,而是指向stat结构的指针。
  5. <sys/stat.h>中的IPC类型宏

三. 下面有一个APUE的原例子,其作用是用来针对命令行参数来打印其文件类型的:

点击(此处)折叠或打开

  1. #include <apue.h>

  2. int main(int argc, char **argv)
  3. {
  4.     int i ; //游标变量
  5.     struct stat buf; //stat结构体成员
  6.     char *ptr ; //用来存储得到类型信息指针

  7.     //参数判断,如果参数小于2个,退出
  8.     if(2 > argc){
  9.         printf("Usage:%s ", argv[0]);
  10.         return -1;
  11.     }

  12.     //循环遍历外部传入文件,并将文件信息记录在buf指向的结构体中
  13.     for(i = 1; i <= argc; ++i){
  14.         printf("%s:", argv[i]);
  15.         if(0 > lstat(argv[i], &buf)){
  16.             err_ret("lstat erro!");
  17.             continue;
  18.         }

  19.         //比对文件buf.st_mode值
  20.         if(S_ISREG(buf.st_mode)){
  21.             ptr = "regular";
  22.         }else if(S_ISDIR(buf.st_mode))(
  23.             ptr = "diretory";
  24.         }else if(S_ISCHR(buf.st_mode))(
  25.             ptr = "character special";
  26.         }else if(S_ISBLK(buf.st_mode))(
  27.             ptr = "block special";
  28.         }else if(S_ISFIFO(buf.st_mode))(
  29.             ptr = "fifo";
  30.         }else if(S_ISLINK(buf.st_mode))(
  31.             ptr = "symbolic link";
  32.         }else if(S_ISSOCK(buf.st_mode))(
  33.             ptr = "socket";
  34.         }else{
  35.             ptr = "** unkown mode **";
  36.         }
  37.     
  38.         //输出文件类型信息
  39.         printf("%s\n", ptr);
  40.     }

  41.     return 0;
  42. }
其运行结果为:

点击(此处)折叠或打开

  1. [root@localhost pthread]# ./a.out /etc/passwd /etc /dev/log\
  2. > /dev/tty /var/lib/oprofile/opd_pipe /dev/sr0 /dev/cdrom
  3. /dec/passwd: directory
  4. /dev/log: socket
  5. /dev/tty: character special
  6. /var/lib/oprofile/opd_pipe: fifo
  7. /dev/sr0: block special
  8. /dev/cdrom: symbolic link
============end=============
小菜总结,如有不当,欢迎指出
阅读(1869) | 评论(0) | 转发(0) |
0

上一篇:文件和目录之stat族函数——APUE学习笔记

下一篇:没有了

给主人留下些什么吧!~~