第2章 操作系统用户命令接口
-
Upload
clinton-dawson -
Category
Documents
-
view
55 -
download
4
description
Transcript of 第2章 操作系统用户命令接口
1
第 2 章 操作系统用户命令接口
•操作系统的发布、安装、和使用•通过编程方式使用操作系统•操作系统的系统生成•添加系统调用•编写 Shell 解释程序
2
操作系统的发布、安装、和使用•概述
•Linux 系统发布方式•Linux 的硬件要求
•Linux 的安装•操作系统的安装概念
•Linux 的使用•Shell 命令•系统调用
•系统管理•su 的使用、添加新用户、 passwd 文件
概述Linux 是由 Linus Benedict Torvalds 等众多软件高手共同开发的多用户操作系统源代码公开、免费提供用户使用、遵守 POSIX (可移植操作系统接口)标准、与 UNIX 兼容Linux 的内核有两种 : 稳定的内核、开发的内核。
–版本号:主版本号 . 次版本号 . 修正次数–如: kernel 2.2.6 表示对内核 2.2 版本的第 6 次修正版。–稳定内核的次版本号为偶数,如 2.2.6–而开发内核所用的则是奇数,如 2.3.6
Linux 是自由软件用户与 Linux 的接口 : shell 命令、系统调用
软件发展的两种模式
分销公司
分销公司
开发者
最终用户
使用
修改
复制、修改、发布
自由软件GPL
自由软件GPL 自由软件
GPL
自由软件GPL
自由软件GPL
自由软件GPL
图 1-9 GPL 能保证自由软件无限发展
公有软件
私有化
私有软件中间环节
最终用户
中间环节
中间环节
中间环节
最终用户不付版权费
付版权费
公有软件
私有软件
私有软件公有软件
公有软件
公有软件
公有领域的软件可能转为私有
General Public License 通用公共许可证
Linux 系统发布方式有多种 Linux 系统发布方式(即有多种 Linux 安装方式)
-Linux 软件以只读光盘的形式发布。-通过 FTP 下载 Linux
发布 Linux 的不同名字和公司-Red Hat Software 发行的 Red Hat Linux -由 Software in the Public Interest, Inc. 发行的 Debian Linux -由 WorkGroup Solutions, Inc. 发行的 Linux Pro -由 Trans-Ameritech 发行的 Trans-Ameritech Linuxware -中科院软件所发行的红旗 Linux -蓝点软件技术有限公司发行的蓝点 Linux
Linux 的硬件要求 •Linux 对计算机硬件的要求并不高。
由于 Linux 本身是 Linux 用户通过 Internet 共同开发的产物,因此它所支持的大部分硬件都是普通用户和开发人员已经拥有的或很容易得到的。
•以 IBM PC 及其兼容机为例
主板支持 ISA 、 VLB 、 EISA 和 PCI 总线结构的系统主板
CPU 支持 Intel Pentium 、 Pentium Pro 、 Pentium II 、 Pentium III 、 PentiumIV
内存 要求 2MB 以上
显示卡 对文本方式,几乎可用所有显示卡
声卡 支持几乎所有声卡
网卡 支持各种通用的以太网卡以及局域网适配器
主板总线 如果说 CPU 是计算机的心脏,那么主板就是计算机的循环系统,主板将 CPU 和计算机上所有其他设备连接起来。
直接相连: CPU 直接读取插在主板上的 RAM 中的数据。
间接相连:如通过 SCSI 适配器读取硬盘数据。
以 IBM PC 及其兼容机为例
ISA : Industry Standard Architecture 用在 x86 中最老的总线
EISA: Extended ISA ( SCSI 上流行,配置难)
VL: VESA 局部总线( Video Electronics Standards Association)
PCI: Peripheral Component Interconnect 目前用得最多
PCMCIA: Pensonal Computer Memory Card International Association 多用于笔记本电脑
http://pcmcia.sourceforge.org
操作系统的安装 计算机执行的任何程序都必须存储到内存中, CPU 只能通过内存访问程序。我们所讨论的操作系统安装过程,实际上是把存放在光盘上的 Linux 执行代码存入硬盘的过程。因为硬盘是 PC 机的固定外部存储设备,从硬盘上加载程序到内存很方便。 另外,操作系统中的文件系统主要是靠硬盘提供物理支持,安装操作系统到硬盘,实际上有两方面的作用:一是在硬盘上建立文件系统,二是把操作系统的全部内容事先存放在硬盘上以便往内存中加载操作系统核心程序时使用。
因此上述的安装概念是指在硬盘上建立文件系统,并将操作系统可执行代码从其他外部介质移动到硬盘上存放的过程。这样当使用计算机时,从硬盘上加载操作系统到内存,然后将控制转给操作系统内核执行。
光盘
硬盘CPU
内存安装
加载
安装示意图
( a )重新分区之前 (b) 重新分区之后图 2-1 破坏性重新分区。
( a )原有分区 ( b )压缩原有数据 ( c )建立新分区图 2-2 非破坏性重新分区
10
Shell举例
• Shell 命令a.out , cd, cat, chmod, cp, cc, ^d, echo, exit, fdisk,
ftp, halt, kill, ls, logout, mail, mkdir, more, mount, umount, ps, pwd, passwd, rmdir, rm, sort, su, telnet , make,man , useradd, userdel , vi, wc, who , |
• Shell 程序见脚本文件 .profile 或者 .bash_profile ,用户在登录
时自动执行。
11
Shell 编程举例
• 修改 .bash_profile 脚本文件trap “$HOME/.logout”0
• 建立 .logout 文件 .logout 的内容如下:rm –f $home/*.log
rm –f $home/*.tmp
echo “Bye…bye $LOGNAME”
12
脚本文件的建立和运行
creat-file 文件的内容如下:cp .logout log.log
cp .logout log.tmp
ls –l *.log
ls –l *.tmp
键入命令: chmod u+x creat-file
PATH=$PATH:$HOME/.
运行 creat-file
13
脚本文件的建立和运行cleanup 文件的内容如下:#!/bin/sh
#name:cleanup
#this is a general cleanup script
echo “starting cleanup…wait”
rm *.log
rm *.tmp
tail –40 .logout >/tmp/messages
mv /tmp/messages /var/tmp/messages
ls /var/tmp
echo “finished cleanup”
键入命令:chmod u+x cleanup
PATH=$PATH:$HOME/.
运行 .bash_profilesh .bash_profile
运行 cleanup
14
编程方式使用操作系统
• fork( ) 系统调用的使用•pipe 系统调用的使用•系统调用小结
fork 、 exit 、 pipe 、 dup、 execl
open 、 close 、 read 、 write
fork() 的使用
main(){ int i; i=fork(); if(i) { printf(“parent”); } else { printf(“child”); }
}
main(){ int i; i=fork(); if(i) { printf(“parent”); } else { printf(“child”); }
}
fork()
PCB1 PCB1
16
系统调用应用举例
• 编制并发程序 pipeline.c• 编制管道写使用的程序 father1.c 作为
父进程的一部分工作• 编制管道读使用的程序 child1.c 作为子
进程的一部分工作
fildes[1]
pipe 系统调用的使用
Father1.c
进程 1
Child1.c
进程 2
fildes[0]
进程的建立
进程的建立#define STD_INPUT 0#define STD_OUTPUT 1int fd[2];main( ){
static char process1[]="father1",process2[]="child1";pipe (fd);pipeline(process1,process2);exit(1);
}
进程的建立(续一)pipeline(process1,process2)
char *process1,*process2;{
int i;while((i=fork())==-1);if(i){
close(fd[0]);close(STD_OUTPUT);dup(fd[1]); // 把 1分为另一个管道写指针close(fd[1]); //关闭原管道写指针execl(process1,process1,0);printf("-----father failed.\n");
}
进程的建立(续二)else{
close(fd[1]);close(STD_INPUT);dup(fd[0]);close(fd[0]);execl(process2,process2,0);printf("-----child failed.\n");
}exit(2);
}
Father1.c
main(){ static char string[]="Parent is using pipe write."; int len; len=sizeof(string); write(1,string,len); printf("parent,parent,parent\n\n\n"); exit(0);}
child1.c
main()
{
char output[30];
read(0,output,30);
printf("-----%s\nchild,child.\n",output);
return(0);
}
系统调用小结
close 关闭文件
dup 复制打开文件的描述符
exit ( int status )终止进程
execl 执行文件
fork( ) 创建子进程
open 为读 /写打开文件
Pipe 建立进程间的通道
read 读文件
write 写文件
24
pipe
int pipe(fildes);
int fildes[2]
建立进程间的通道,返回两个描述 :
fildes[0] 用于读管道。fildes[1] 用于写管道。
25
close
close(fildes);
int fildes;
关闭文件描述符
26
dup
int dup(fildes); 复制文件描述符,成功则返回新的文件
描述符,是最低有效文件描述符,失败则返回 -1 。
int fildes;
从某个 creat,open,dup,fcntl, 或者 pipe 得到的文件描述符。
27
exitvoid exit(status)
int status;
在调用进程中的所有打开的文件描述符统统被关闭。如果调用进程的父进程正在执行一个 wait, 那么通告
它调用进程的结束并使得 status 的低八位有效,即 0377
如果调用进程的父进程不是正在执行 wait ,那么调用进程被变换成“已经僵死”的进程,即仅占用进程表一个槽的进程,用户空间和核内空间都为分给该进程。
28
execl
execl(path,arg0,arg1,…,argn,(char *)0);
char *path, *arg0,*arg1,…,*argn;
执行一个文件,成功则用 path 文件覆盖当前调用者文件,失败则有返回。
29
fork( )
int fork( );
建立子进程返回值:0 子进程返回〉 0 父进程返回的子进程标识符 pid
-1 进程创建失败
30
open
#include <fcntl.h>
int open(path,oflag[,mode])
char *path; // 文件路径int oflag,mode;//状态标志
31
read
int read(fildes,buf,nbyte)
int fildes;
char *buf;
unsigned nbyte;
fildes 是从某个 creat, dup, open, fcntl, pipe 调用中返回的文件描述符。
32
write
int write(fildes,buf,nbyte)
int fildes;
char *buf;
unsigned nbyte;
33
Linux 系统生成• 步骤1 、安装源代码盘2 、解压缩3 、编译生成系统4 、修改 lilo.conf 文件5 、运行 /sbin/lilo -v
34
安装源代码盘
1 、 mount /dev/cdrom /mnt/cdrom
2 、 cd /mnt/cdrom/SRPMS
35
解压缩
3 、 rpm -Fvh 文件名 .src.rpm4 、 rpm -Fvh kernel-2.4.2-2.src.rpm
此时,在 /usr/SOURCE 目录下生成了文件:Linux-2.4.2.tar.bz2
5 、 cd /usr/SOURCE6 、 bunzip2 –fvL linux-2.4.2.tar.bz2
此时,在 /usr/SOURCE 目录下生成了文件:linux-2.4.2.tar
7 、 tar xvf linux-2.4.2.tar此时,在 /usr/SOURCE 目录下生成了目录:
linux源代码便在其中。
36
编译生成系统
cd linuxvi Makefile删除 #…=/boot 句中的 #make menuconfig (选择 exit 并保存配置)make dep make bzImagemake modulesmake modules_installmake install在 /boot 目录下可找到新生成的执行程序
修改 lilo.conf 文件
boot=/dev/hdamap=/boot/mapinstall=/boot/boot.bprompttimeout=50message=/boot/message
lba32default=linux
image=/boot/vmlinuz-2.4.2-2label=linuxread-onlyroot=/dev/hda3
other=/dev/hda1optionallabel=dos
实验与大作业安排该模拟文件系统包括目录文件、普通文件, i 结点和存储区,并实现下面一些基本功能:1.改变目录: CD 〈目录名〉,工作目录转到指定的目录下。目录名支持全路径名和当前目录的路径名。目录不存在时, 给出错误信息。2.创建文件: EDIT 〈文件名〉,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。对于重名文件给出错误信息。3.删除文件: DEL 〈文件名〉,删除指定的文件。文件不存在时给出错误信息。4.显示目录: DIR [〈目录名〉 ] ,显示目录下全部文件和第一级子目录,如果没有指定路径名,则显示当前目录下的内容。5.创建目录: MD 〈目录名〉,再指定路径下创建指定的目录,或者在没有指定路径时,在当前目录下创建子目录,对于重名目录给出错误信息。6.删除目录: RD 〈目录名〉,删除指定的目录,如果该目录为空,则可删除,否则给出是否做删除,删除操作将该目录下的全部文件和子目录都删除。注:( 1 )上面目录名和文件名都支持全路径名和相对当前目录的路径名。文件名由目录结构中各级文件名分量排列构成。各分量间用“ /”隔开。 ( 2 )程序初始化时应构造如图1-1所示的目录结构
目录树
/
bin
usr
etc
lib user bin
liu sun fti
unix
目录文件
无框:普通文件
图 1-1 初始的目录树
40
本章小结
• Linux 的安装• Linux 命令的使用• Shell 编程• 系统调用的使用• 从源码生成新的 Linux 系统• 加入新的系统调用的方法• Shell 命令解释程序的形成