Linux⽂件系统--简述⼏种⽂件类型
  Linux 中⼀切皆为⽂件,⽂件类型也有多种,使⽤ ls -l 命令可以查看⽂件的属性,所显⽰结果的第⼀列的第⼀个字符⽤来表明该⽂件的⽂件类型,如下:
1、普通⽂件
  使⽤ ls -l 命令后,第⼀列第⼀个字符为 "-" 的⽂件为普通⽂件,如上图所⽰,普通⽂件⼀般为灰⾊字体,绿⾊字体的是可执⾏⽂件,红⾊字体的是压缩⽂件。
⽂件的权限:
  以普通⽂件为例,使⽤ ls -l 命令,可以看到结果的第⼀列是 -rwxrwxrwx 的形式,其中第⼀个字符 "-" 表⽰这个⽂件为普通⽂件,它也可以是其他的字符,不同的字符代表不同类型的⽂件。其后的⼀串字符表明了该⽂件的权限,其中:
1)r 表明该⽂件具有可读权限,若该位置为 "-" ,则表明⽂件不可读;
2)w 表明该⽂件具有写权限,若该位置为 "-" ,则表明⽂件不可写;
3)x 表明该⽂件具有可执⾏权限,若该位置为 "-" ,则表明⽂件不具有可执⾏权限;
4)第⼀个 rwx 表⽰该⽂件的所有者对该⽂件的权限;第⼆个 rwx 表⽰该⽂件所属组对该⽂件的权限;第三个 rwx 表⽰其他⽤户对该⽂件的权限。
创建⼀个普通⽂件:
  可以使⽤ touch 命令来创建⼀个⽂件:
touch newfile
删除⼀个普通⽂件:
  可以使⽤ rm 命令来删除⼀个⽂件:
rm newfile
2、⽬录⽂件
  Linux 中的⽬录也是⽂件,⽬录⽂件中保存着该⽬录下其他⽂件的 inode 号和⽂件名等信息,⽬录⽂件中的每个数据项都是指向某个⽂件 inode 号的链接,删除⽂件名就等于删除与之对应的链接。⽬录⽂件的字体颜⾊是蓝⾊,使⽤ ls -l 命令查看,第⼀个字符为"d"(directory)。
⽬录⽂件的权限:
1)r 表明该⽬录⽂件具有可读权限,即可以使⽤ ls 命令查看该⽬录的存储情况;
2)w 表明该⽬录⽂件具有写权限,即可以往该⽬录下添加、修改、删除⽂件;
3)x 表明该⽬录⽂件具有可执⾏⽂件,即可以使⽤ cd 命令进⼊到该⽬录下。
  可以使⽤ chmod 指令来改变⽂件的权限。
创建⼀个⽬录:
  可以使⽤ mkdir 命令来创建⼀个⽬录⽂件:
mkdir directory
删除⼀个⽬录:
  可以使⽤ rmdir 命令来删除⼀个空⽬录:
rmdir directory
  如果该⽬录下有其他⽂件,则可以使⽤ rm -r 命令来递归删除该⽬录下的所有⽂件。需要注意的是,使⽤该命令将会删除该⽬录及⽬录下的所有数据,过程不可逆,需要谨慎使⽤:
rm -r directory
3、链接⽂件
  链接⽂件⼀般指的是⼀个⽂件的软连接(或符号链接),使⽤ ls -l 命令查看,第⼀个符号为  "l",⽂件名为浅蓝⾊,如下:
  这⾥,test_softlink 就是⼀个链接⽂件,从结果上还可以看到它是⽂件 的软链接,删除原⽂件 的话,对应的软链接⽂件test_softlink 也会消失。可以使⽤ ln 命令来创建⼀个⽂件的链接⽂件:
1)软链接
  软链接(⼜称符号链接),使⽤ ln -s file file_softlink 命令可以创建⼀个⽂件的软链接⽂件:
ln - test_softlink
  软链接相当于给原⽂件创建了⼀个快捷⽅式,如果删除原⽂件,则对应的软链接⽂件也会消失。
2)硬链接
  硬链接,相当于给原⽂件取了个别名,其实两者是同⼀个⽂件,删除⼆者中任何⼀个,另⼀个不会消失;对其中任何⼀个进⾏更改,另⼀个的内容也会随之改变,因为这两个本质上是同⼀个⽂件,只是名字不同。使⽤ ls -i 命令查看,可以发现硬链接的两个⽂件的 inode 号是⼀样的:
  同样的,使⽤ ln 命令可以创建⼀个⽂件的硬链接:
test_hardlink
4、设备⽂件
linux建立文件系统的命令  Linux 中的硬件设备如硬盘、⿏标等也都被表⽰为⽂件,即为设备⽂件。设备⽂件⼀般存放在 /dev/ ⽬录下,⽂件名为黄⾊,如下:
  设备⽂件分两种:
1)块设备⽂件:
  块设备⽂件⽀持以块(block)为单位的访问⽅式。在 EXT4 ⽂件系统中,⼀个 block 通常为 4KB 的
⼤⼩,也就是说每次可以存取4096(或其整数倍)个字节的数据。应⽤程序可以随机访问块设备⽂件的数据,程序可以⾃⾏确定数据的位置,硬盘、软盘等都是块设备。使⽤ ls -l 命令查看,块设备⽂件的第⼀个字符是 "b"(block)。
2)字符设备⽂件:
  字符设备⽂件以字节流的⽅式进⾏访问,由字符设备驱动程序来实现这种特性,这通常要⽤到 open、close、read、write 等系统调⽤。字符终端、串⼝和键盘等就是字符设备。另外,由于字符设备⽂件是以⽂件流的⽅式进⾏访问的,因此可以顺序读取,但通常不⽀持随机存取。使⽤ ls -l 命令查看,字符设备⽂件的第⼀个字符是 "c"(char)。
5、管道⽂件(FIFO⽂件)
  管道⽂件主要⽤于进程间通信,使⽤ ls -l 命令查看,第⼀个字符为 "p"(pipe)。可以使⽤ mkfifo 命令来创建⼀个管道⽂件:
mkfifo fifo_file
php substring截取字符串  在 FIFO 中可以很好地解决在⽆关进程间数据交换的要求,FIFO 的通信⽅式类似于在进程中使⽤⽂件来传输数据,只不过 FIFO 类型的⽂件同时具有管道的特性,在读取数据时,FIFO 管道中同时清除
数据。
UNIX系统的⼤多数⽂件是普通⽂件或⽬录,但是也有另外⼀些⽂件类型。⽂件类型包括如下⼏种:
(1)普通⽂件(regular file)。这是最常见的⽂件类型,这种⽂件包含了某种形式的数据。⾄于这种数据是⽂本还是⼆进制数据对于UNIX 内核⽽⾔并⽆区别。对普通⽂件的解释由处理该⽂件的应⽤程序进⾏。
⼀个值得注意的例外是⼆进制可执⾏⽂件。为了执⾏程序,内核必须理解其格式。所有⼆进制可执⾏⽂件都遵循⼀种格式,这种格式使内核能够确定程序⽂本和数据的加载位置。
relative permittivity
(2)⽬录⽂件(directory file)。这种⽂件包含了其他⽂件的名字以及指向这些⽂件有关信息的指针。对⼀个⽬录⽂件具有读权限的任⼀进程都可以读该⽬录的内容,但只有内核可以直接写⽬录⽂件。进程必须使⽤特定的函数才能更改⽬录。
(3)块特殊⽂件(block special file)。这种⽂件类型提供对设备(例如磁盘)带缓冲的访问,每次访问以固定长度为单位进⾏。
(4)字符特殊⽂件(character special file)。这种⽂件类型提供对设备不带缓冲的访问,每次访问长度可变。系统中的所有设备要么是字
符特殊⽂件,要么是块特殊⽂件。
(5)FIFO。这种类型⽂件⽤于进程间通信,有时也将其称为命名管道(named pipe)。
(6)套接字(socket)。这种⽂件类型⽤于进程间的⽹络通信。套接字也可⽤于在⼀台宿主机上进程之间的⾮⽹络通信。
(7)符号链接(symbolic link)。这种⽂件类型指向另⼀个⽂件。
⽂件类型信息包含在stat结构的st_mode成员中。可以⽤表4-1中的宏确定⽂件类型。这些宏的参数都是stat结构中的st_mode成员。
表4-1 <sys/stat.h>中的⽂件类型宏
printf属于什么成分宏⽂件类型
S_ISREG()普通⽂件
S_ISDIR()⽬录⽂件
S_ISCHR()字符特殊⽂件
S_ISBLK()块特殊⽂件
S_ISFIFO()管道或FIFO
S_ISLNK()符号链接
S_ISSOCK()套接字
POSIX.1允许实现将进程间通信(IPC)对象(例如,消息队列和信号量等)表⽰为⽂件。表4-2的宏⽤来确定IPC对象的类型。这些宏与表4-1中的不同,它们的参数并⾮st_mode⽽是指向stat结构的指针。
表4-2 <sys/stat.h>中的IPC类型宏
宏对象的类型
S_TYPEISMQ()消息队列
S_TYPEISSEM()信号量
S_TYPEISSHM()共享存储对象
注:Linux系统并不将这些对象表⽰为⽂件。
程序清单4-1 对每个命令⾏参数打印⽂件类型
[root@localhost apue]# cat prog4-1.c
#include "apue.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)
{
err_ret("lstat error");
continue;
}
if(S_ISREG(buf.st_mode))
ptr = "regular";
else if(S_ISDIR(buf.st_mode))mid是什么意思
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))
css啥意思ptr = "symbolic link";
else if(S_ISSOCK(buf.st_mode))
ptr = "socket";
else
ptr = "** unknown mode **";
printf("%s\n", ptr);
}
exit(0);
}
编译后运⾏该程序:
[root@localhost apue]# ./prog4-1 /etc/passwd /etc /dev/initctl /dev/log /dev/tty /dev/fd0 /dev/cdrom
./prog4-1: regular
/etc/passwd: regular
/etc: directory
/dev/initctl: fifo
/
dev/log: socket
/dev/tty: character special
/dev/fd0: block special
/dev/cdrom: symbolic link
我们特地使⽤了lstat函数⽽不是stat函数以便检测符号链接。如若使⽤了stat函数,则不会观察到符号链接。
为了在Linux系统上编译该程序,必须定义_GUN_SOURCE,这样就能包括S_ISSOCK宏的定义。(我使⽤的是2.6.18内核Linux,编译上述程序时,并没有⾃⼰定义_GUN_SOURCE,编译通过且运⾏成功。)
早期的UNIX系统版本并不提供S_ISxxx宏,于是就需要将st_mode与屏蔽字S_FIMT进⾏逻辑“与”运算,然后与名为S_IFxxx的常量相⽐较。⼤多数系统在⽂件<sys/stat.h>中定义了此屏蔽字和相关的常量。如若查看此⽂件,则可到S_ISDIR宏定义为:
#define S_ISDIR(mode)    (((mode) & S_IFMT) == S_IFDIR)
转⾃:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。