搜索
您的当前位置:首页操作系统实验报告-完全版

操作系统实验报告-完全版

来源:乌哈旅游


《计算机操作系统》

实验报告

班级:

姓名:

学号:

实验一 进程控制与描述

一、实验目的

通过对Windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows 2000的结构。通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000中进程的“一生”。

二、实验环境

硬件环境:计算机一台,局域网环境;

软件环境:Windows 2000 Professional、Visual C++ 企业版。

,

第一部分:

程序1-1Windows 2000 的GUI 应用程序

Windows 2000 Professional下的GUI应用程序,使用Visual C++编译器创建一个GUI应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。

三、实验内容和步骤

# include <> # pragma comment(lib, “” ) int APIENTRY WinMain(HINSTANCE HINSTANCE LPSTR int { ,

:: MessageBox( NULL, “hello, Windows 2000” , “Greetings”, MB_OK) ;

/* hInstance */ ,

/* hPrevInstance */, /* lpCmdLine */, /* nCmdShow */ )

return(0) ; }

在程序1-1的GUI应用程序中,首先需要头文件,以便获得传送给WinMain() 和MessageBox() API函数的数据类型定义。

接着的pragma指令指示编译器/连接器找到库文件并将其与产生的EXE文件连接起来。这样就可以运行简单的命令行命令CL 来创建这一应用程序,如果没有pragma指令,则MessageBox() API函数就成为未定义的了。这一指令是Visual Studio C++ 编译器特有的。

接下来是WinMain() 方法。其中有四个由实际的低级入口点传递来的参数。hInstance参数用来装入与代码相连的图标或位图一类的资源,无论何时,都可用GetModuleHandle() API函数将这些资源提取出来。系统利用实例句柄来指明代码和初始的数据装在内存的何处。句柄的数值实际上是EXE文件映像的基地址,通常为0x00400000。下一个参数hPrevInstance是为向后兼容而设的,现在系统将其设为NULL。应用程序的命令行 (不包括程序的名称) 是lpCmdLine参数。另外,系统利用nCmdShow参数告诉应用程序如何显示它的主窗口 (选项包括最小化、最大化和正常) 。

最后,程序调用MessageBox() API函数并退出。如果在进入消息循环之前就结束运行的话,最后必须返回0。

先分析程序功能,再写出运行结果:

操作系统将当前运行的应用程序看作是进程对象。利用系统提供的惟一的称为句柄 (HANDLE) 的号码,就可与进程对象交互。这一号码只对当前进程有效。

在系统中运行的任何进程都可调用GetCurrentProcess() API函数,此函数可返回标识进程本身的句柄。然后就可在Windows需要该进程的有关情况时,利用这一句柄来提供。

程序1-2: 获得和使用进程的句柄

# include <>

# include void main() {

HANDLE hProcessThis = :: GetCurrentProcess() ; :

DWORD dwPriority = :: GetPriorityClass(hProcessThis) ; std :: cout << “Current process priority: ” ; switch(dwPriority) {

case HIGH_PRIORITY_CLASS: std :: cout << “High” ; break;

case NORMAL_PRIORITY_CLASS: std :: cout << “Normal” ; break;

case IDLE_PRIORITY_CLASS: `

std :: cout << “Idle” ; break;

case REALTIME_PRIORITY_CLASS: std :: cout << “Realtime” ; break; default:

std :: cout << “” ; break; }

std :: cout << std :: endl; }

?

程序1-2中列出的是一种获得进程句柄的方法。对于进程句柄可进行的惟一有用的操作是在API调用时,将其作为参数传送给系统,正如程序1-2中对GetPriorityClass() API函数的调用那样。在这种情况下,系统向进程对象内“窥视”,以决定其优先级,然后将此优先级返回给应用程序。

OpenProcess() 和CreateProcess() API函数也可以用于提取进程句柄。前者提取的是已经存在的进程的句柄,而后者创建一个新进程,并将其句柄提供出来。

先分析程序功能,再写出运行结果:

程序1-3显示如何找出系统中正在运行的所有进程,如何利用OpenProcess() API函数来获得每一个访问进程的进一步信息。

程序1-3 利用句柄查出进程的详细信息

__________NULL__________________________;

d.___________NULL________________________; e. ___________FALSE____;

f.__________CREATE NEW CONSOLE________; )

g.__________szCmdLine_________________________; h. __________NULL__________________________; i.___________&si________________________; j. ___________&pi____; 程序运行时屏幕显示的信息是:

*(此图是最后出现的一个图,在此之前连续出现几个图。)

<< << std :: endl;

if == VER_PLATFORM_WIN32_NT && >= 5) {

:: SetPriorityClass(

;

1、 正在运行的进程.

使用进程和操作系统的版本信息

:: GetCurrentProcess() , HIGH_PRIORITY_CLASS) ;

std :: cout << “Task Manager should now now indicate this” “process is high priority.” << std :: endl; }

:

}

分析程序,写出运行结果:

当前PID信息:_______1492______________________________________________ 当前操作系统版本:___Running on OS:

系统提示信息:Task Manager should now indiate this process is high priority.

_______________________________________________________________________

程序向读者表明了如何获得当前的PID和所需的进程版本信息。为了运行这一程序,系统处理了所有的版本不兼容问题。

接着,程序演示了如何使用GetVersionEx() API函数来提取OSVERSIONINFOEX结构。这一数据块中包括了操作系统的版本信息。其中,“OS : ”表示当前运行的操作系统是:

____Windows2000_当前版本为_OS:

最后一段程序利用了操作系统的版本信息,以确认运行的是Windows 2000。代码接着将当前进程的优先级提高到比正常级别高。

单击Ctrl + Alt + Del键,进入“Windows任务管理器”,在“应用程序”选项卡中右键单击本任务,在快捷菜单中选择“转到进程”命令。

在“Windows任务管理器”的“进程”选项卡中,与本任务对应的进程映像名称是 (为什么) :

_________

右键单击该进程名,在快捷菜单中选择“设置优先级”命令,可以调整该进程的优先级,如设置为“高”后重新运行程序,屏幕显示有变化吗为什么

_____屏幕显示有变化。Process ID值由1492变为:3152________________ 2、 终止进程

指令其子进程来“杀掉”自己的父进程

<< std :: endl;

:: StartClone() ; :: Sleep(5000) ;

std :: cout << “Telling the child process to quit. ” << std :: endl;

:: ReleaseMutex(hMutexSuicide) ; :: CloseHandle(hMutexSuicide) ;}

}

void Child() {” << std :: endl;

:: WaitForSingleObject(hMutexSuicide, INFINITE) ; std :: cout << “Child quiting. ” << std :: endl; :: CloseHandle(hMutexSuicide) ; }}

int main(int argc, char* argv[] ) { ·

if (argc >1&& :: strcmp(argv[1] , “child” ) == 0) { Child() ; }

else

{Parent() ;} return 0; }

程序说明了一个进程从“生”到“死”的整个一生。第一次执行时,它创建一个子进程,其行为如同“父亲”。在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。当创建子进程时,就打开了互斥体并在其他线程中进行别的处理工作,同时等待着父进程使用ReleaseMutex() API发出“死亡”信号。然后用Sleep() API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。

当调用ExitProcess() 时要小心,进程中的所有线程都被立刻通知停止。在设计应用程序时,必须让主线程在正常的C++ 运行期关闭 (这是由编译器提供的缺省行为) 之后来调用这一函数。当它转向受信状态时,通常可创建一个每个活动线程都可等待和停止的终止事件。

在正常的终止操作中,进程的每个工作线程都要终止,由主线程调用ExitProcess()。接着,管理层对进程增加的所有对象释放引用,并将用 GetExitCodeProcess() 建立的退出代码从STILL_ACTIVE改变为在ExitProcess() 调用中返回的值。最后,主线程对象也如同进程对象一样转变为受信状态。

等到所有打开的句柄都关闭之后,管理层的对象管理器才销毁进程对象本身。还没有一种函数可取得终止后的进程对象为其参数,从而使其“复活”。当进程对象引用一个终止了的对象时,有好几个API函数仍然是有用的。进程可使用退出代码将终止方式通知给调用GetExitCodeProcess() 的其他进程。同时,GetProcessTimes() API函数可向主调者显示进程的终止时间。

先分析程序功能,再写出运行结果:

1) _第一次执行时,它创建一个子进程,其行为如同“父亲”。 表示:_ Creating the child process.

2) ______用Sleep() API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。

表示:Telling the child process to quit

在熟悉源代码的基础上,利用本实验介绍的API函数来尝试改进本程序 (例如使用GetProcessTimes() API函数) 并运行。请描述你所做的工作:

____GetProcessTimes() API 可向主调者显示进程终止时间___________________

_

四、实验总结

~

进程具有的特征:结构特征、动态性、并发性、独立性和异步性。 对于进程的定义可以从不同的角度来说,其中较为典型的定义有: (1)进程是程序的一次执行

(2)进程是一个程序及其数据在处理机上顺序执行时发生的活动

(3)进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。

对于传统os中的进程定义为:进程是进程实体的运行过程,使系统进行资源分配和调

度的一个独立单位。

进程有三种基本状态:就绪状态、执行状态、阻塞状态。 创建一个进程:

(1)、申请空白的PCB (2)为进城分配资源 (3)初始化进程控制块

(4)|

(5)将进程插入就绪队列

终止一个进程:

(1)根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态

(2)若终止进程正处于执行状态,应立即中止该进程的执行,并置调度标志为真,用于

指示该进程被终止进程的后应该重新进行调度

(3)若该进程还有子孙进程,还应该将其所有的子孙进程终止,以防止他们成为不可控的进程

(4)将终止进程所拥有的全部资源,或者归还给其父进程,或者归还给系统 (5)将终止进程PCB从所在队列中移除,等待其他程序来搜索信 通过实验更清楚的了解了进程,理解了进程的创建过程和终止过程

\\

!

实验二 并发与调度

一、实验目的

在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000线程同步的理解。通过分析实验程序,了解管理事件对象的API。了解在进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。

在Linux Redhat 操作系统平台上,用pipe()创建一个管道文件,然后用fork()创建两个生产进程和两个消费进程,它们之间通过pipe()传递消息。

二、实验环境

硬件环境:计算机一台,局域网环境; }

软件环境:Windows 2000 Professional,Linux Redhat 操作系统平台,Visual C++ 企

业版。

三、实验内容和步骤

第一部分:互斥体对象

本程序中显示的类CCountUpDown使用了一个互斥体来保证对两个线程间单一数值的访问。每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。创建者实际上创建的是互斥体对象,计数方法执行等待并释放,为的是共同使用互斥体所需的资源 (因而也就是共享资源) 。

利用互斥体保护共享资源

. (低32位)

0) ; . (低32位) NULL) ; . (低32位)

0 ) ; .\"<< std :: endl; :: WaitForSingleObject(hThread, INFINITE) ; } 。

:: Sleep(500) ;

__ MapViewOfFile( )

b. ___ UnmapViewOfFile(pData)__________________________________________ 3) 运行时,程序首先通过 (CreateFileMapping( ) ) 函数创建一个小型的文件映射对象 ( hMapping ) ,接着,使用系统API函数 (g_hMutexMapping ) 再创建一个

保护其应用的互斥体 (CreateMutex()) 。然后,应用程序创建100个线程,每个都允许进行同样的进程,即:通过互斥体获得访问权,这个操作是由语句:_ for (int nTotal = 100; nTotal > 0 ; -- nTotal)

{

. (低32位)

0 ) ;

hread_request[k] =

-1;

Thread_Info[j].n_request = 0; }

erial;

inFile >> Thread_Info[n_Thread].entity; ~

inFile >> Thread_Info[n_Thread].delay; char c; (c);

while(c!='\\n'&& !()){ inFile>>

Thread_Info[n_Thread].thread_request[Thread_Info[n_Thread].n_request++]; (c); }

n_Thread++; }

erial; %

char Temp_entity = Thread_Info[j].entity; double Temp_delay = Thread_Info[j].delay; printf(\" \\n thread%2d %c %f \

int Temp_request = Thread_Info[j].n_request; for(int k=0;kprintf(\" %d \ cout<printf(\"\\n\\n\");

ntity =='P') …

h_Thread[i]= CreateThread (NULL,0,(LPTHREAD_START_ROUTINE)(Produce), &(Thread_Info[i]),0,NULL); else

h_Thread[i]=CreateThread (NULL,0,(LPTHREAD_START_ROUTINE)(Consume), &(Thread_Info[i]),0,NULL); }

\\n\");

printf(\"按任意键返回!\\n\"); _getch(); return 0; — }

_request;j++)

if(Thread_Info[i].thread_request[j] == req) return TRUE;

return FALSE; }

n\ ?

n\

Buffer_Critical[ProducePos] = m_serial;

printf(\"生产者 %2d 完成生产过程 :\\n \

printf(\" 缓冲区[ %2d ]:%3d \\n\" ,ProducePos,Buffer_Critical[ProducePos]);

rite==1)

printf(\"将页%d写回磁盘第%d块\\n\ 5、page[j].flag=0;

6、page[lnumber].flag=1; 7、page[lnumber].write=0;

8、page[lnumber].pnumber=page[j].pnumber;

printf(\"淘汰主存块%2d中的页%2d,从磁盘第%d块中调入页%2d\\n\

'

9、page[j].pnumber10、j 11、page[lnumber].dnumber12、lnumber);

); }

void command(unsigned laddress,int write) { unsigned paddress, ad,pnumber,lnumber; kk:

13、lnumber=laddress>>10; 14、ad=laddress&0x3FF; if(lnumber>=page_length) {

printf(\"不存在该页\\n\"); ·

15、page_interrupt(lnumber); }

if(page[lnumber].flag==1) {

16、pnumber=page[lnumber].pnumber; 17、paddress=pnumber<<10|ad; rite=1; } else {

18、page_interrupt(lnumber); 、

goto kk; } }

main()

{ int lnumber,flag,pnumber,write,dnumber; unsigned laddress; int i;

printf(\"输入页表的信息,创建页表(若页号为-1,则结束输入)\\n\"); printf(\"输入页号和辅存地址:\"); scanf(\"%d%d\ i=0; .

while(lnumber!=-1)

{19、page[lnumber].lnumber=lnumber; 20、page[lnumber].dnumber=dnumber; 21、i++;

printf(\"输入页号和辅存地址:\");

scanf(\"%d%d\ }

page_length=i;

printf(\"输入主存块号,主存块数要小于%d,(以-1结束):\ scanf(\"%d\ m=0; >

head=0;

while(pnumber!=-1) { if(m<=i) {

24、p[m]=m;

25、page[m].pnumber=pnumber; 26、page[m].flag=1; 27、m++; }

Scanf7d\ } (

printf(\"输入指令性质(1-修改,0-不需要,其他-结束程序运行)和逻辑地址:\");

scanf(\"%d%x\ while(write==0||write==1) {

28、command(laddress,write);

printf(\"输入指令性质(1-修改,0-不需要,其他-结束程序运行)和逻辑地址:\");

scanf(\"%d%x\ } }

5、程序运行结果及简要分析

首先,通过键盘依次输入了4个主存块,块号为4,6,8,3,同时,将第0,1,2,3个页面依次调入块4,6,8,3中,将这4个页面的页号相应地存入数组p[0],p[1],p[2],p[3]中,然后再通过键盘依次输入逻辑地址:23,456,abc,2000,然后分离出逻辑地址高六位的页号和低10位的页内地址,由于前3个逻辑地址对应的页号在主存中,所以将这3个页号对应的主存块号和页内地址合成为物理地址;对于最后1个逻辑地址,由于对应的页号不在主存中,所以要进行缺页处理,采用FIFO算法。

实验总结:

通过本次实验让我明白了许多,做事要认真仔细,页式存储管理怎么去执行,掌握请调策略,放置策略,淘汰策略,怎样进行页式地址转换,选用什么置换算法最好。

实验五 设备管理模拟实验

一、实验目的 。

(1) 了解Windows操作系统中设备驱动程序的组成

(2) 理解Windows操作系统的设备管理机制

(3) 掌握Windows操作系统关于设备管理的API函数的使用方法 (4) 了解并掌握Windows中鼠标、键盘等简单设备的检测方法 二、实验内容

1、源程序:

#include <> #include <> #include <> #include <> void menu(); 、

void quit(); void error();

void CheckKeyboard(); void PlayMusic(); void main() {

char UserSelect; DEVMODE DevM;

int iSavecaretBlinkTime=350; do { `

menu();

UserSelect=getch(); putchar(UserSelect); switch(UserSelect) {

case '1':

SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP,1,0,0);

文件信息命令

步骤1:开机,登录进入GNOME。

在GNOME登录框中填写指导老师分配的用户名和口令并登录。 步骤2:访问命令行。

单击红帽子,在“GNOME帮助”菜单中单击“系统工具”-“终端”命令,打开终端窗口。

`

步骤3:使用控制字符执行特殊功能。

控制字符用来执行特殊的作业,如中止和启动屏幕输出。

大多数PC键盘有两个控制键。它们通常标记为Ctr1,可以在键盘的左右下角找到。为了输入一个控制字符序列,可按住Ctrl键不放,然后按下键盘上相应的字符。

Ctrl + C:中断当前活动。当你在csh中键入一个不可识别的命令行 (例如,$ls “) ,收到第2个提示符的时候,Ctrl + C也可以用于恢复shell提示符。

Ctrl + Z:终止当前活动。显示ls命令的手册页面 (man ls) ,然后使用Ctrl -z中止输出。

当你接下Ctrl + Z的时候,发生了什么事情 中止当前活动,返回终端窗口

Ctrl + D:表示文件的末尾或者退出。 Ctrl + D用于退出一些Linux工具程序 (bc、write等) ,退出一个终端窗口,注销一个终端会话或者命令行登录会话。作为一个一般的规则,当您出现“死机”时,或者如果Ctrl + C不起作用,可试试Ctrl + D。例如:

1) 在shell提示符下键入bc,启动基本的计算器工具程序。 2) 把两个数字相乘 (键入:458*594,然后按回车键) 。 3) 按Ctrl + D退出计算器。 ?

当使用计算器的时候,你的提示符是什么

This is free software with ABSOLUTELY NO WARRANTY. Ctrl + U :擦除整个命令行。Ctrl + U最常用在: · 一个擦除决定不执行的命令行的快捷方式。 · 如果登录到一个远程系统,退格键不起作用。

· 它可以确保在登录的时候,从一个“空”的用户帐号和口令输入开始。

· 因为在口令输入的时候看不见它们,当知道自己键入了错误字符的时候,使用Ctrl + U擦除密码,重新开始输入。

如果输入一个命令,如ls –R/,有时候,会在按下回车键之前想擦除命令行。输入一个命令,在接下回车键执行命令之前按下Ctrl + U。结果是什么

输入的命令被擦除 步骤4:使用file命令确定文件类型。

在Linux系统中可以找到许多类型的文件。文件类型可以通过使用file命令来确定。当一个用户试图打开或阅读一个文件的时候,这个信息很重要。确定文件类型可以帮助一个用户决定使用哪个程序或命令来打开这个文件。这个命令的输出最常见的是如下几种:文本文件、可执行文件或数据文件。

}

1) 文本文件:包括ASCII或英语文本、命令文本和可执行的shell脚本。这种类型的文件可以使用cat或more命令读取,可以使用vi或其他文本编辑器编辑。

单击红帽子,在“GNOME帮助”菜单中单击“辅助设施”-“Text Editor”命令,在文本编辑中键入适当内容并保存为test文件。

使用file命令来确定test文件的文件类型。它是哪种类型的文件 ASCLL test

2) 可执行 (或二进制) 文件:包括32位的可执行文件和可扩展链接格式(ELF) 编码文件,和其他动态链接的可执行文件。这种文件类型表示这个文件是一个命令或程序。

单击红帽子,在“GNOME帮助”菜单中单击“办公”-“ Writer”命令,建立一个文档如。

使用file命令确定你所建立的文件类型。它是哪种类型的文件(注意文件名部分必须包括扩展名,如file 。)

可执行文件

3) 数据文件:数据文件是由系统中运行的应用创建的。在某些情况下,文件的类型是会说明的。例如,FrameMaker (桌面印刷软件) 文档。

使用file命令确定dir1/coffees子目录中beans文件的文件类型。它是什么文件类型的

}

步骤5:使用strings命令。

strings命令可以用于打印可执行文件或者二进制文件中的可读字符。 一些有编程背景的人,可以解释strings产生的输出。这个命令在这里只是作为一个展示可执行文件中可打印字符的方法来介绍。strings命令必须用于读取可执行文件,如 /usr/bin/cat。在大多数情况下,strings命令也可以给出命令的使用语法。

使用strings命令查看 /usr/bin/cal文件的可读字符。列出strings命令中的一些输出。

/lib/ putshar strerror _puts wcstombl nbstowcs Verrx strrchr wcscpy dcgettext

步骤6:使用cat命令显示文件的内容。

cat命令在屏幕上显示一个文本文件的内容。它常用于显示如脚本文件 (类似批处理文件) 这样的短文本文件。如果文件超过一屏的话,必须使用一个屏幕可以滚动的窗口,如GNOME环境中的终端窗口。

键入 ls /dev > dev1 :

使用cat命令显示主目录中dev1文件的内容。文本的显示出现了什么情况

显示出一长串字符内容,必须按滚动条才能看到全部的内容

步骤7:使用more命令显示文件的内容。

more命令是一个用于显示文本文件首选的方法,因为它会自动的一次显示一屏文件内容。如果文件的信息比一屏更长,屏幕的底部显示如下的信息:--More-- (n%) (文件的n%已经显示) 。按下回车键,继续一次显示一行信息。空格键将继续一次显示一屏内容。

使用more命令显示主目录中dev1文件的内容。文本的显示出现了什么情况

首先显示出第一页的内容,按一次回车键则显示下一行的内容 ,按空格键则显示下一页内容

步骤8:使用head命令显示文件的一部分。

head命令用于显示一个或多个文本文件的前n行。在默认情况下,如果没有给出 -n选项,将显示前10行。当您只想查看文件的开始的几行,而不管文件的大小的时候,head命令是很有用的。

1) 单独使用head命令,显示主目录中dev1文件的开始部分。显示了多少行 !

显示了10行

2) 使用带 -n选项的head命令,显示主目录中dante文件的前20行。您输入什么命令

head -20 dante

步骤9:使用tail命令显示文件的一部分。

使用tail命令,显示文件的最后几行。在默认情况下,如果没有指定 -n选项,将显示最后10行。当检查大型日志文件最近输入内容的时候,tail命令是很有用的。备份工具程序常把备份哪个文件和什么时候做的备份,写到日志文件中去。一个备份日志文件中最后的输入通常是备份文件的总数和备份是否成功完成的信息。-n选项显示了文件的最后n行。

单独使用tail命令,显示主目录中dante文件的末端。显示了多少行 显示了10行

步骤10:通过使用wc命令,确定行数、单词数和字符数。 ' wc (单词计数) 命令可以用于显示文本文件的行数、单词数、字节数或者字符数。当确定文件特征或者当比较两个文件的时候,这个命令是很有用的。使用不带选项的wc将给出文件的行数、字节数。使用带一个选项的wc,可以确定想查看的哪一项内容。

使用wc命令确定主目录中dev1文件的行数、单词数和字符数。有多少行、多少个单词和多少个字符

7520行 7520个词 47288个字符

步骤11:使用wc计算目录条目的数目。

使用wc和ls命令确定主目录中条目 (文件和目录) 的数目。为此,必须把ls命令的输出导入到wc命令中。

更多符号是竖线,和后斜线 (\\) 在同一个键上。在命令行提示行下,输入命令ls | wc -w。有多少个文件和目录名 (单词)

125

步骤12:使用diff命令确定文件之间的不同之处。

diff (不同) 命令用于比较2个文本文件,找出在它们之间的不同之处。wc命令可以比较文件,因为它计算行数、单词数和字符数。有可能2个文件有相同的行数、单词数和字符数,但是字符和单词不同。diff命令可以从实际上找出文件之间的不同。

这个命令的输出把2个文本文件之间的不同一行一行的显示出来。diff命令有2个选项:-i 和 -c。-i选项忽略字母的大小写,例如A和a相等。-c选项执行细致的比较。

单击红帽子,在“GNOME帮助”菜单中单击“辅助设施”-“Text Editor”命令,创建两个文件fruit1和fruit2,并键入适当内容。

使用diff命令执行细节比较,确定fruit1文件和fruit2文件之间的区别。 在fruit1文件和在fruit2文件中,哪几行是不同的 在fruit1中的内容是9apple

在fruit2中的内容是abcdefghiapple

1) cat命令:

· 对fruit1文件使用cat命令。 · 对fruit2文件使用cat命令。

· 键入命令行cat fruit1 fruit2 > filex。 ¥

· 对filex文件使用cat命令。上面的命令行做了什么工作

将fruit1和fruit2的内容各并在一起,成为filex的内容

2) 可以使用哪2个命令来确定2个文件是否相同

diff fruit1 fruit2和cat fruit1,cat fruit2

步骤13:关闭终端窗口,注销。 2. 基本的命令行文件管理

步骤14:回顾Linux的文件和目录命名规则。

在本实验中,我们将创建文件和目录,因此,在开始之前,先来回顾一下Linux文件和目录的命名规则和指导方针。

1) 最大长度:组成文件和目录名最大长度为255个数字字母字符。一般来说,应该尽可能的保持文件名短但是仍然有意义。

$

2) 非数字字母字符:一些非数字字母字符或者元字符是可用的:下划线 (_) 、连字符号 (-) 和句点 (.) 。这些元字符可以在文件或目录名中使用多次是一个有效的文件或目录名) 。尽管shell允许把星号 (*) 、问号() 和发音符号 (~) 、方话号 ([ ]) 、&、管道 [ | ] 、引号 (“”) 和美元符号 ($) 在文件名中使用,但这不是推荐的,因为这些字符对于shell有特殊的意义。分号 (;) 、小于号 (<) 和大于号 (>) 是不允许作为文件名的。

3) 文件名扩展:文件名可以包含一个或多个扩展名。扩展名常被一个应用追加到文件的末端。扩展名通常是1个到3个字符,追加到文件名的末端,之前有一个句点 (.) 。当命名文件的时候,您可以选择使用这个规则。

4) 目录名的扩展名:目录名一般不包含扩展名,但是也没有规则反对这一点。 5) 大小写敏感:Linux文件和目录名是大小写敏感的。Project1和projectl不是同一个文件。在一个目录中,不能够有两个文件有着同样的名字。一般规则都是使用小写字母。

检查表7-1中的文件名,指出它们是否是有效或者推荐的Linux文件或目录名,为什么是或为什么不是。

表7-1 实验记录 文件名 12345abcde678 Hobbies: 2 Adcd-123 Sales*repts*2001 ] 是否为Linux文件或目录名 是 》为什么是或为什么不是 文件和目录名长度没有超过256个数字子母字符 空格不允许在文件和目录名中使用 下划线可以在文件名中使用 “*”可以在文件和目录名中使用 “.”允许在文件和目录名中使用 不是 是 不是 是 Projects> 不是 大于号是不允许作为文件名的

步骤15:使用touch命令创建文件。

每次创建一个新的字处理文档或者电子数据表,就是正在创建一个新文件,应该符合之前提到的文件命名规则。也必须拥有创建文件的目录的足够权限。

使用touch命令,可以同时创建一个或多个文件。一些应用要求在写文件之前,文件必须存在。touch命令对于快速创建需要处理的文件很有用。也可以使用touch命令更新文件被访问的时间和日期,使文件可以再次被备份。当创建文件或目录的时候,可以指定绝对和相对的路径名。

命令格式: —

touch filename (s)

1) 在主目录中使用touch命令创建一个名为newfile的文件,应该使用什么命令 touch newfile

2) 使用touch命令在这个目录中创建另一个叫做filenew的新文件,应该使用什么命令

touch filenew

3) 输入命令显示practice目录中的文件的长列表。创建的文件列出来了吗

列出来了 '

4) 谁是文件的所有者

student

5) 和文件关连的组是什么

student 6) 创建的日期和时间是什么 2010-12-08 9:05:49 7) 文件的大小是多少

kb

8) 使用file命令确定newfile的文件类型。它是哪一类的文件 empty , 9) 使用touch命令同时创建3个文件:new1、new2和new3,应该使用什么命令 cd practice

Touch new1 new2 new3

10) 输入命令显示practice目录中文件的长列表。创建的3个新文件列出来了吗 列出来了

步骤16:使用mkdir命令创建新目录。 mkdir (创建目录) 命令用于创建目录或文件夹。目录可以包含其他目录,称为子目录,它们可以包含文件。

目录可以使用或者绝对路径名或者相对路径名创建。可以在同一行中指定多个目录名,创建多个新目录。必须有创建目录的足够权限。

mkdir directory_name (s)

1) 从主目录中,使用相对路径名改变到practice目录中。使用什么命令 cd/practice ` 2) 使用mkdir命令,在这个目录中创建一个叫做newdir的子目录。使用什么命令 mkdir/newdir

3) 输入命令,显示practice目录中文件和目录的长列表。创建的目录列出来了吗

列出来了 4) 目录的所有者是

root 5) 文件的大小是多少

4096

6) 使用file命令确定newdir文件的类型。它是哪一类的文件 目录文件directory

7) 如果名字中没有字符dir,采取别的什么方法来识别出它是一个目录 {

颜色识别,目录颜色是蓝色的

8) mkdir命令创建3个目录,目录名分别为high、medium和low,应该使用什么命令 mkdir/high mkdir/medium mkdir/low 9) 用ls命令检查创建是否成功 成功

步骤17:使用rm命令删除文件。

rm目录可以删除单个文件或多个文件。可以通过在rm命令之后指定文件的名字,或者使用星号 (*) 和问号 () 元字符,同时删除几个文件。在Linux系统中删除的文件是永远被删除了,除非使用图形界面删除文件,它们才能够被恢复。rm命令可以带 –i (交互) 选项使用,它在删除文件之前会提示用户。使用rm -i命令作为防范,避免误删文件:

rm [-i] filename (s)

1) 使用rm命令删除早先在practice目录中创建的newfile文件,应该使用什么命令 rm –r practice/newfile

2) 输入命令显示practice目录中文件的长列表。创建的文件还在吗 不在

3) 使用带 -i选项的rm命令,删除早先在practice目录中创建的filenew文件。交互式选项起到什么作用

在删除之前提示用户,避免误删文件

4) 删除早先创建的三个名为new1、new2和new3的文件。使用问号 () 通配符使用一个命令删除所有三个文件。使用什么命令

rm new

5) 输入命令,显示practice目录中文件的长列表。三个文件还在吗 不在

6) 还有其他的什么方法来删除new1、new2和new3文件 rm new[1-3]

步骤18:使用rm -r命令删除目录。 rm -r目录用于删除目录。它将删除从目标目录开始的目录,包括所有的子目录和文件。当rm命令带 -r信息使用的时候,它可以删除单个目录 (空或不空) 或目录树的整节。rm命令可以带 -i选项使用,它在删除目录之前会提醒用户:

rm –r [i] directory_name (s)

1) 删除早先创建的newdir子目录,使用什么命令 rm –ri practice/newdir

2) 输入命令显示practice目录中文件的长列表,创建的子目录还在吗 不在

3) 改变到早先创建的mediurn子目录中,输入什么命令

cd practice/mediurn 4) 删除早先创建的low子目录,使用什么命令 rm –ri practice/low

5) 用相对路径名和快捷方式,改变回到practice子目录中,应使用什么命令 cd..

6) 使用一个命令删除high和medium子目录,应使用什么命令 rm –ri hingh medium 步骤19:练习所学习到的内容。

通过在practice目录中创建一个三级的目录树,练习使用touch、mkdir和rm命令。试着使用有意义的目录名。记住可以使用一个命令创建整个目录结构。在每个目录中创建多个文件。记住可以使用一个命令创建多个文件。

结束的时候,请删除实验时创建的文件和目录。 步骤20:关闭终端窗口,注销

一、 实验总结

通过本实验真正使用到了Linux系统,对linux系统有个大概的了解,知道了linux系统的大体结构和使用方法。知道了各个组合键的意义。能在没有鼠标的情况下进行对文件的操作。操作起来每次键入均需要重新输入指令,虽然繁复但简洁明确不易出现冲突,较windows更安全,鉴于自身的结构模式又具有不易感染不安全代码等优势。

在Linux操作系统中使用命令来分析和管理文件目录是非常重要的。Ls可以查看指定目录下的文件和目录,mkdir可以创建子目录,rmdir可以删除子目录,pwd可以查看目前目录位置,比用ls简单,cd即使更改当前目录,相当于“电梯”,tree在我们操作的系统中不可显示,cp可以创建文件等。此外在复制操作时经常出现类似于乱码的现象,经过讨论和询问,了解到,现象的产生是基于该系统不可显示中文导致。也了解到有些时候出现乱码即为操作有误。

通过这次实验,我对Linux操作系统有了更深刻的认识,同时也会简单使用Linux和对它的基本功能有了一定程度的了解与运用。还知道了Linux操作系统中各种常见命令,正是这些命令,使Linux系统的操作变得简单易学。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top