加入收藏 | 设为首页 | 会员中心 | 我要投稿 成都站长网 (https://www.028zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

Unix文件类型

发布时间:2022-09-30 04:32:43 所属栏目:Unix 来源:未知
导读: UNIX系统的大多数文件是普通文件或目录unix系统文件,但是也有另外一些文件类型。文件类型包括如下几种。
(1)普通文件(regular file).这是最常用的文件类型,这种文件包含了某种形式的数据

UNIX系统的大多数文件是普通文件或目录unix系统文件,但是也有另外一些文件类型。文件类型包括如下几种。

(1)普通文件(regular file).这是最常用的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据,对于UNIX内核而言并无区别。对于普通文件内容的解释由处理文件的应用程序进行。

(一个值得注意的例外是二进制可执行文件。为了执行程序,内核必须理解其格式。所有二进制可执行文件都遵循一种标准化的格式,这种格式使内核能够确定程序文本和数据加载的位置,比如windows上面的EXE可执行文件放到UNIX下就不能执行,因为UNIX不知道EXE程序文本和数据加载的位置。)

(2)目录文件(directory file)。这种文件包含了其他文件的命字以及指向与这些文件有关信息的指针。对一个目录文件具有读权限的任一进程都可以读该目录的内容,但只有内核可以直接写目录文件。进程必须使用函数才能更改目录。

(3)块特殊文件(block special file)。这种类型的文件提供对设备(如磁盘)带缓冲的访问,每次访问可以固定长度为单位进行。

**注意:**FreeBSD不再支持块特殊文件。对设备的所有访问需要通过字符串特殊文件进行。

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

(5)FIFO。这种类型的文件用于进程间通信,有时也称为命名管道(named pipe)

(6)套接字(socket)。这种类型的文件用于进程间的网络通信。套接字也可用于在一台宿主机上进程之间的非网络通信。

(7)符合链接(symbolic link).这种类型的文件指向另一个文件。

文件类型信息包含在stat结构的st_mode成员中,可用下图4-1中的宏确定文件类型。这些宏的参数都是stat结构中的st_mode成员。

这里写图片描述

(图4-1)

POSIX.1允许实现将进程间通信(IPC)对象(如消息队列和信号量等)说明为文件。图4-2中的宏可用来从stat结构中确定IPC对象的类型。这些宏与图4-1中的不同,它们的参数并非st_mode,而是指向stat结构的指针。

这里写图片描述

(图4-2)

消息队列,信号量以及共享存储对象在APUE讨论的4中UNIX系统中都不将这些对象表示为文件。(其实我并不知它具体指的是哪4个系统)

例子:

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

运行结果如下图:

这里写图片描述

有三个文件,没有结果因为我用的是Centos 6.8估计是路径不对.

(编辑:成都站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章