欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

unix核心编程原理(一)

程序员文章站 2022-05-24 08:42:50
...

unix系统是一个多用户系统,他允许很多用户很多程序同时工作,程序经常对文件,目录进行操作,对数据进行转换或传输。同一台机器上的不同程序之间,甚至不同机器上程序之间通过网络都可以通信。

登录-运行程序-注销
在登录过程中,当用户名和密码通过验证后,系统会启动一个叫shell的进程,然后把用户交给这个进程,由这个进程处理用户的请求。每个用户都有属于自己的shell进程。也说明了unix支持多用户的特点。

shell中有些常用的命令:比如who,ls等。
这些命令是如何实现的呢?
这些大都是一个个用c写的可执行程序。当你在shell环境里敲这个命令时,shell就会启动一个该命令的进程来执行。在unix中增加一个命令是很容易的事,把程序的可执行文件放到一下任意一个目录即可:/bin,/usr/bin,/usr/local/bin,这些目录里面存放着很多系统命令。

who命令可以查看系统的登录用户有那些,它又是如何实现的呢?
在系统里用一个utmp文件,专门用于记录用户的登录情况。who通过读文件来获得需要的信息,而每个登录的用户在文件中都有对应的记录。根据文件中的记录的数据结构,读取出相应的内容就行了。当一个文件已经被打开,是否允许再次打开呢?这种情况发生在有多个进程要同时访问一个文件的时候。Unix并不禁止一个文件同时被多个进程访问,如果禁止的话,那两个用户就无法同时使用who命令了。

如何对文件进行操作:如果文件被顺利打开,内核会返回一个正整数的值,这个数值就叫做文件描述符。必须通过文件描述符对文件进行操作。

同理,执行logout命令,就是打开utmp文件,从中找到包含你所在终端的登录记录对当前记录做修改。关闭文件。主要是如何把修改过的记录写回文件问题,可以调用系统函数lseek()使用文件指针找到相应位置,把修改过的内容从新写回,覆盖原来的即可。

为什么系统调用需要很多时间?
用户进程位于用户空间,内核位于系统空间,磁盘只能被内核直接访问。程序要读取磁盘上的数据只能通过系统调用read,而read的代码在内核中,所以当read调用发生时,执行权会从用户代码转移到内核代码,执行内核代码是需要时间的。系统调用的开销大不仅仅是因为要传输数据,当运行内核代码时,CPU工作在管理员(又称超级用户模式)模式,这对应于一些特殊的堆栈和内存环境,必须在系统调用发生时间建立好。系统调用结束后(read返回时),cpu要切换到用户模式,必须把堆栈和内存环境恢复成用户程序运行时的状态,这种运行环境的切换要消耗很多时间。


现在再来了解一下ls的工作原理:
每次使用ls时,会列出相应目录下的目录和文件名。我们首先了解目录是什么。目录是一种特殊的文件,他的内容是文件和目录的名字。从某种意义上说,目录文件与utmp文件很类似。他们都包含很多记录,每个记录的格式由统一的标准定义。与普通文件不同的是,目录文件的内容永远不为空,每个目录都都至少包含两个特殊的项--".","..",前者表示当前目录,后者表示上一级目录。目录是文件的列表,更确切的说,是记录的序列,每条记录对应一个文件或子目录,通过readdir读取目录中的记录即可,解析数据结构,打印出文件或目录名,这样就实现了ls命令,当然还要注意打印输出时的排版格式。