Linux教学中进程之间通过特殊文件通信的解析*

2022-10-14 06:55庞伟业袁继泉陈星宇
计算机时代 2022年10期
关键词:鉴权同组命名

赵 宏,庞伟业,袁继泉,陈星宇

(兰州理工大学计算机与通信学院,甘肃 兰州 730050)

0 引言

Linux 符 合POSIX(Portable Operating System Interface)标准,功能强大,效率高,配置灵活且安全性高,具有丰富的工具软件和应用软件,广泛应用在各行各业,运行在包括大型机、中型机、小型机、工作站、微机、嵌入式设备、可穿戴设备等各种机型和硬件平台上,是开放源代码和自由软件中的杰出代表,是我国开发国产操作系统的主要依托。

许多高校将Linux 相关内容纳入教学,在信息类专业中开设Linux 操作系统、Linux 系统内核分析、Linux系统程序设计、Linux网络编程等课程。

在Linux 相关教学中,Linux 系统中的文件管理是核心内容。大多数教科书列举了Linux 中的文件类型,包括普通文件(-)、目录文件(d)、字符设备文件(c)、块设备文件(b)、符号链接文件(l)、命名管道文件(p)和套接字文件(s)等七种文件类型。对于前五种文件,一般都有详细讲解,有实例,对于后两种文件均一带而过。文献[6]和文献[7]对命名管道和套接字文件有较为详细的介绍,用实例演示了这两种文件的用法,但对于这两种文件为什么会用于进程之间的通信,未给出进一步的说明。

本文从Linux 系统文件授权机制和安全保障机制出发,结合用户进程之间通信时的权限需求,介绍命名管道文件和套接字文件的使用,加深学生对Linux系统中进程之间通信中借用文件授权机制的认识,引导学生在实际中使用命名管道文件和套接字文件。

1 进程和进程通信

进程是程序在数据集上运行的过程,程序运行中所需的系统资源,例如内存、CPU 等,需要以进程的身份进行申请,因此,进程是获得系统资源的基本单位。一个进程的执行过程可以看作是一个任务的执行过程,多个进程的同时执行,可以看作是多个任务的同时执行。现代计算机操作系统都支持多进程的同时执行。多进程的同时执行分为并行、并发以和并行与并发的混合。并行就是不同的进程同时执行在不同CPU 或者不同核上。并发就是多个进程以一定规则轮流在同一个CPU或者核上执行,由于CPU执行速度很快,尽管微观上来看是多个进程轮流执行,但宏观上却表现出多个进程的同时执行。并行与并发的混合指多个进程执行时既有并行也有并发,是现代多CPU或者多核计算机运行的常见形式。

多个同时运行的进程之间经常需要进行通信,常用的通信方式有锁、信号量、消息队列、共享内存、无名管道、命名管道、套接字等多种形式。进程之间通信时,如果不需要对参与通信的进程权限进行验证,则根据实际需要选用锁、信号量、消息队列、共享内存、无名管道等通信方式中的一种通信方式即可;但是,如果需要对参与通信的进程进行权限验证,则需要使用命名管道或套接字通信方式进行,这是因为命名管道或套接字通信方式可以使用文件系统完善的鉴权机制,实现不同用户的进程之间通信时不同进程具有不同操作权限的功能。

2 文件系统鉴权机制

Linux 主要使用Ext 系列文件系统,Ext 系列文件系统具有完善的鉴权机制,分为基本权限、扩展权限、文件属性设置、操作控制列表等多级权限。进程之间利用命名管道或者套接字通信时,由于生成了相应的管道文件和套接字文件,因此,可以使用文件系统的鉴权机制。

2.1 文件基本权限

读权限和写权限是文件基本权限。用单词read的第一个字母r 表示文件“可读”;用单词write 的第一个字母w 表示文件“可修改/删除”。还有文件的可执行权限,用单词execute的第二个字母x表示。

文件的三种操作:文件主,表示拥有文件的用户,用单词user的第一个字母u 表示;同组用户,表示与拥有文件的用户属于同一个组,用单词group 的第一个字母g表示;其他用户,表示与拥有文件的用户不属于同一个组,用单词other的第一个字母o表示。

对文件操作的三类用户和文件的三种操作权限进行组合,形成文件的基本操作属性,分三组,每组三位。第一组表示文件主对文件的操作权限,第二组表示同组用户对文件的操作权限,第三组表示其他用户对文件的操作权限。每一个位置需要标上操作权限,若没有操作权限,用符号“-”表示。例如:rwxr-xr--,表示文件主对文件具有读、写和执行权限;同组用户对文件具有读和执行权限;其他用户对文件仅有读权限。

文件的授权属性经常用9 位二进制数记录,有权限的位设为1,无权限的位设为0,转换为三位八进制数表示。例如:二进制数111101100,转换为八进制为754,表示文件主对文件具有读、写和执行权限;同组用户对文件具有读和执行权限;其他用户对文件仅有读权限。

文件的基本权限是不同用户进程之间利用命名管道或者套接字通信时主要使用的权限。

1、品种选择:应根据本地区的生态环境条件,选用高产、优质、适应性及抗病性强、生育期所需积温比动地常年活动积温少150℃的优良品种。

2.2 文件扩展权限

在文件基本权限的基础上扩展了SUID、SGID 和粘附位等,形成文件扩展权限。其中,SUID 表示当文件执行时,执行该文件的用户能够在文件执行期间获得文件主的权限;SGID 表示当文件执行时,执行该文件的用户在文件执行期间拥有文件主所在主组用户的权限;粘附位表示只有文件主和root 用户才能删除带有该标识的文件,其他用户虽然有“w”权限,但仍然不能删除带有该标识的文件。

由于进程之间利用命名管道或者套接字通信时主要在内存中进行数据交换,而文件扩展权限主要用于文件执行和删除,因此,进程之间利用命名管道或者套接字通信时一般不使用文件扩展权限。

2.3 文件属性设置

文件属性在文件基本权限基础上,对文件自身和内容进行更近一步的保护,使用命令chattr 设置文件属性,命令lsattr查看文件的属性。

文件属性对命名管道文件和套接字文件无效,因此,进程之间利用命名管道或者套接字通信时不能使用文件属性的设置。

2.4 操作控制列表设置

操作控制列表在文件基本权限基础上,对文件的操作权限作更细致的设置,用命令setfacl 设置文件的操作控制列表,用命令getfacl 查看文件操作控制列表的设置。例如命令:setfacl -m user1:rw a1.txt,设置用户user1拥有对文件a1.txt的读写权限。

不同用户进程之间利用命名管道或者套接字通信时,可以使用文件的操作控制列表设置。

3 不同用户进程之间通过命名管道通信实例

3.1 命名管道文件的创建

用户user1 运行以下Python 程序,创建属于自己的命名管道文件pipe1。

上述代码调用模块os 中的mkfifo()函数,创建命名管道文件pipe1,如果pipe1文件已经存在,则输出捕获到的“File exists”的异常。

默认情况下,命名管道文件pipe1 的操作权限为:rw-r--r--,即文件主对文件可读可写,同组用户和其他用户对文件可读。

3.2 命名管道文件的使用

user1 通过命名管道发送消息,user2 通过命名管道接收消息。

user1运行下面的代码,向命名管道文件写入消息。

user2运行下面的代码,从命名管道文件读取消息。

上述user1和user2通过命名管道通信成功。

user1 运行命令:chmod 600 pipe1,使得管道文件pipe1 的操作权限变为:rw----,即同组用户和其他用户对管道文件pipe1不再拥有任何操作权限。

再次让user1和user2通过命名管道通信,user2运行接收消息的程序时,会收到“PermissionError:[Errno 13]Permission denied: '/home/user1/pipe1'”错误提示,这表示用户对pipe1文件没有相应的操作权限。

user1运行命令chmod或者setfacl,使得user2拥有对文件pipe1 的读权限,此时,user1 和user2 通过命名管道的通信会再次成功。

4 不同用户进程之间通过套接字通信实例

进程之以套接字方式通信时,套接字文件需要服务端新建,因此,同一用户的进程之间通过套接字通信时,不存在文件权限的问题。而不同用户的进程之间通信时,会因为客户端对新建的套接字文件无写权限而导致通信失败,因此,不同进程之间通过套接字通信时,在套接字文件建立后,需要使用chmod 或者setfacl 命令,给客户端进程的用户授权套接字文件的写权限。

假设用户user1 的进程为服务端,用户user2 的进程为客户端,两者之间通过套接字通信,服务端Python代码如下:

该段程序第四行引入os 模块,是因为需要修改套接字文件的操作权限;第五行设定进程之间使用套接字文件通信;第六行会自动创建套接字文件a.socket,若a.socket 已经存在,则会出错;第七行调用os 模块的system 函数,使用命令setfacl 给user2 赋予套接字文件a.socket 的读写权限;第23 行调用os 模块的system 函数,使用命令rm删除使用完毕的套接字文件a.socket。客户端Python代码如下。

用户user1 运行服务端代码,用户user2 运行客户端代码,可以实现user2 将字符串通过套接字发送给user1,user1 将收到的字符串中的字母转换为大写后,返回给user2,user2接收转换后的字符串并输出。

User1 和user2 通过套接字方式通信时,若用户user1 或user2 对套接字文件a.socket 无读写权限时,程序执行将会出错。

5 结束语

命名管道和套接字文件是Linux 系统中的重要文件类型,利用命名管道和套接字可以实现不同用户进程之间的通信,并且可以使用Linux 系统文件的鉴权。本文通过命名管道和套接字文件,分析不同用户的进程通信时,借用文件系统鉴权机制的实例,帮助学生深入理解Linux系统。

猜你喜欢
鉴权同组命名
命名——助力有机化学的学习
新知
有一种男人以“暖”命名
基于小型核心网的LTE鉴权的一种新实现
河鲀命名小考
电信增值业务运营中的认证鉴权控制方案研究
基于安全机制的SQN同步的研究和实现