unix核心编程原理(一)

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命令,当然还要注意打印输出时的排版格式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值