您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页操作系统实验报告-完全版

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

来源:爱go旅游网
操作系统实验报告-完全版

《计算机操作系统》实验报告班级:姓名:学号:

实验⼀进程控制与描述⼀、实验⽬的

通过对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 */ ,HINSTANCE /* hPrevInstance */,LPSTR /* lpCmdLine */,int /* nCmdShow */ ){

:: MessageBox(NULL,

“hello, Windows 2000” ,“Greetings”,MB_OK) ;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 <># includevoid 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____;程序运⾏时屏幕显⽰的信息是:

*(此图是最后出现的⼀个图,在此之前连续出现⼏个图。)1、正在运⾏的进程.

使⽤进程和操作系统的版本信息<< << std :: endl;

if == VER_PLATFORM_WIN32_NT &&>= 5){

:: SetPriorityClass(:: 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)将进程插⼊就绪队列终⽌⼀个进程:

(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;k

printf(\" %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 nbstowcsVerrx 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中的内容是abcdefghiapple1) 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允许把星号 (*) 、问号() 和发⾳符号 (~) 、⽅话号 ([ ]) 、&、管道[ |] 、引号(“”) 和美元符号 ($) 在⽂件名中使⽤,但这不是推荐的,因为这些字符

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

Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务