河北工业大学2014操作技巧系统实验报告.doc
-/河北工业大学操作系统2014版实验报告实验一 进程控制与描述一、实验目的通过对Windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows 2000的结构。通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000进程的“一生”。三、实验内容和步骤第一部分:Windows 2000 Professional下的GUI应用程序,使用Visual C+编译器创建一个GUI应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。 程序1-1 Windows 2000的GUI应用程序 也可以利用任何其他文本编辑器键入程序代码,如果这样,例如使用WORD来键入和编辑程序,则应该注意什么问题?保存时,将文件保存为扩展名为*.cpp的C+源文件。在程序1-1的GUI应用程序中,首先需要Windows.h头文件,以便获得传送给WinMain() 和MessageBox() API函数的数据类型定义。接着的pragma指令指示编译器/连接器找到User32.LIB库文件并将其与产生的EXE文件连接起来。这样就可以运行简单的命令行命令CL MsgBox.CPP来创建这一应用程序,如果没有pragma指令,则MessageBox() API函数就成为未定义的了。这一指令是Visual Studio C+ 编译器特有的。接下来是WinMain() 方法。其中有四个由实际的低级入口点传递来的参数。hInstance参数用来装入与代码相连的图标或位图一类的资源,无论何时,都可用GetModuleHandle() API函数将这些资源提取出来。系统利用实例句柄来指明代码和初始的数据装在内存的何处。句柄的数值实际上是EXE文件映像的基地址,通常为0x00400000。下一个参数hPrevInstance是为向后兼容而设的,现在系统将其设为NULL。应用程序的命令行 (不包括程序的名称) 是lpCmdLine参数。另外,系统利用nCmdShow参数告诉应用程序如何显示它的主窗口 (选项包括最小化、最大化和正常) 。最后,程序调用MessageBox() API函数并退出。如果在进入消息循环之前就结束运行的话,最后必须返回0。运行结果:弹出一个消息框,标题为Greetings,内容为Hello,Windows Xp,中间有一个确认按钮。进程对象操作系统将当前运行的应用程序看作是进程对象。利用系统提供的惟一的称为句柄 (HANDLE) 的号码,就可与进程对象交互。这一号码只对当前进程有效。本实验表示了一个简单的进程句柄的应用。在系统中运行的任何进程都可调用GetCurrentProcess() API函数,此函数可返回标识进程本身的句柄。然后就可在Windows需要该进程的有关情况时,利用这一句柄来提供。程序1-2: 获得和使用进程的句柄 程序1-2中列出的是一种获得进程句柄的方法。对于进程句柄可进行的惟一有用的操作是在API调用时,将其作为参数传送给系统,正如程序1-2中对GetPriorityClass() API函数的调用那样。在这种情况下,系统向进程对象内“窥视”,以决定其优先级,然后将此优先级返回给应用程序。OpenProcess() 和CreateProcess() API函数也可以用于提取进程句柄。前者提取的是已经存在的进程的句柄,而后者创建一个新进程,并将其句柄提供出来。1-2.cpp的运行结果:进程优先权为Normal。程序1-3显示如何找出系统中正在运行的所有进程,如何利用OpenProcess() API函数来获得每一个访问进程的进一步信息。程序1-3 利用句柄查出进程的详细信息程序1-3程序首先利用Windows 2000的新特性,即工具帮助库来获得当前运行的所有进程的快照。然后应用程序进入快照中的每一个进程,得到其以PROCESSENTRY32结构表示的属性。这一结构用来向OpenProcess() API函数提供进程的ID。Windows跟踪每一进程的有关时间,示例中是通过打开的进程句柄和GetProcessTimes() API来直询得到有关时间的。接下来,一个定制的帮助函数取得了几个返回的数值,然后计算进程在内核模式下消耗的时间占总时间的百分比。程序的其余部分比较简单,只是将有关信息显示给用户,清除进程句柄,然后继续循环,直到所有进程都计算过为止。运行结果:第二部分:进程的“一生”1、 创建进程创建子进程本程序展示的是一个简单的使用CreateProcess() API函数的例子。首先形成简单的命令行,提供当前的EXE文件的指定文件名和代表生成克隆进程的号码。大多数参数都可取缺省值,但是创建标志参数使用了:行为像一个子进程的标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标记。然后该克隆进程的创建方法关闭传递过来的句柄并返回main() 函数。在关闭程序之前,每一进程的执行主线程暂停一下,以便让用户看到其中的至少一个窗口。CreateProcess() 函数有 5 个核心参数?本实验程序中设置的各个参数的值是:a. (LPCTSTR lpApplicationName) szFilename, / 产生这个EXE的应用程序的名称;b. (LPTSTR lpCommandLine) szCmdLine, / 告诉其行为像一个子进程的标志;c. (BOOL bInheritHandles) FALSE, / 不继承句柄;d. (LPSTARTUPINFO lpStartupInfo) &si, / 启动信息;e. (LPPROCESS_INFORMATION lpProcessInformation) &pi); / 返回的进程信息;程序运行时屏幕显示的信息是:2、 正在运行的进程使用进程和操作系统的版本信息运行结果:当前PID信息:_4664当前操作系统版本:5.1(我的操作系统为Windows XP)系统提示信息:Task Manager should now now indicate this process is high priority程序向读者表明了如何获得当前的PID和所需的进程版本信息。为了运行这一程序,系统处理了所有的版本不兼容问题。接着,程序演示了如何使用GetVersionEx() API函数来提取OSVERSIONINFOEX结构。这一数据块中包括了操作系统的版本信息。其中,“OS : 5.0”表示当前运行的操作系统是:Windows 2000。最后一段程序利用了操作系统的版本信息,以确认运行的是Windows 2000。代码接着将当前进程的优先级提高到比正常级别高。单击Ctrl + Alt + Del键,进入“Windows任务管理器”,在“应用程序”选项卡中右键单击本任务,在快捷菜单中选择“转到进程”命令。在“Windows任务管理器”的“进程”选项卡中,与本任务对应的进程映像名称是 (为什么?) :VCSPAWN.EXE右键单击该进程名,在快捷菜单中选择“设置优先级”命令,可以调整该进程的优先级,如设置为“高”后重新运行程序,屏幕显示有变化吗? 没有。3、 终止进程指令其子进程来“杀掉”自己的父进程 程序说明了一个进程从“生”到“死”的整个一生。第一次执行时,它创建一个子进程,其行为如同“父亲”。在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。当创建子进程时,就打开了互斥体并在其他线程中进行别的处理工作,同时等待着父进程使用ReleaseMutex() API发出“死亡”信号。然后用Sleep() API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。当调用ExitProcess() 时要小心,进程中的所有线程都被立刻通知停止。在设计应用程序时,必须让主线程在正常的C+ 运行期关闭 (这是由编译器提供的缺省行为) 之后来调用这一函数。当它转向受信状态时,通常可创建一个每个活动线程都可等待和停止的终止事件。在正常的终止操作中,进程的每个工作线程都要终止,由主线程调用ExitProcess()。接着,管理层对进程增加的所有对象释放引用,并将用 GetExitCodeProcess() 建立的退出代码从STILL_ACTIVE改变为在ExitProcess() 调用中返回的值。最后,主线程对象也如同进程对象一样转变为受信状态。等到所有打开的句柄都关闭之后,管理层的对象管理器才销毁进程对象本身。还没有一种函数可取得终止后的进程对象为其参数,从而使其“复活”。当进程对象引用一个终止了的对象时,有好几个API函数仍然是有用的。进程可使用退出代码将终止方式通知给调用GetExitCodeProcess() 的其他进程。同时,GetProcessTimes() API函数可向主调者显示进程的终止时间。运行结果:1) _Creating the child process._Child waiting for suicide instructions.表示:_父进程正在创建子进程。子进程等待父进程杀死子进程。_2) _Telling the child process to quit._表示:_父进程杀死子进程。_四、实验总结 请总结一下本次实验的收获、教训和感受,结合课本内容谈一下你对进程的理解。本次实验让我明白进程是程序的一次执行过程,是系统进行处理机调度和资源分配的基本单位。(未引入线程之前)。进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元,对父进程和子进程的关系有了进一步的了解。实验二 并发与调度1、 实验目的在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000线程同步的理解。通过分析实验程序,了解管理事件对象的API。了解在进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。二、实验内容和步骤第一部分:互斥体对象本程序中显示的类CCountUpDown使用了一个互斥体来保证对两个线程间单一数值的访问。每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。创建者实际上创建的是互斥体对象,计数方法执行等待并释放,为的是共同使用互斥体所需的资源 (因而也就是共享资源) 。1、利用互斥体保护共享资源分析程序的运行结果,可以看到线程 (加和减线程) 的交替执行 (因为Sleep() API允许Windows切换线程) 。在每次运行之后,数值应该返回初始值 (0) ,因为在每次运行之后写入线程在等待队列中变成最后一个,内核保证它在其他线程工作时不会再运行。1) 请描述运行结果 (如果运行不成功,则可能的原因是什么?) :两个线程交替运行,不断改变value的值。两个线程互斥访问Value的值。2) 根据运行输出结果,对照分析程序,可以看出程序运行的流程吗?请简单描述:线程1(5296)先运行,将value值增1,变为1。然后,线程2(6016)运行,将value值减1,变为0. 第二部分:线程通过文件对象发送数据Windows 2000提供的线程间通讯类内核对象允许同一进程或跨进程的线程之间互相发送信息,包括文件、文件映射、邮件位和命名管道等,其中最常用的是文件和文件映射。这类对象允许一个线程很容易地向同一进程或其他进程中的另一线程发送信息。1、演示线程通过文件对象发送数据运行结果 (如果运行不成功,则可能的原因是什么?) :阅读和分析程序,请回答问题:1) 程序中启动了多少个单独的读写线程? 1002) 使用了哪个系统API函数来创建线程例程?CreateThread() 3) 文件的读和写操作分别使用了哪个API函数?ReadFile() WriteFile()每次运行进程时,都可看到程序中的每个线程从前面的线程中读取数据并将数据增加,文件中的数值连续增加。这个示例是很简单的通讯机制。可将这一示例用作编写自己的文件读/写代码的模板。请注意程序中写入之前文件指针的重置。重置文件指针是必要的,因为该指针在读取结束时将处于前四个字节之后,同一指针还要用于向文件写入数据。如果函数向该处写入新数值,则下次进程运行时,只能读到原来的数值。那么:4) 在程序中,重置文件指针使用了哪一个函数?SetFilePointer()5) 从输出结果,对照分析程序,可以看出程序运行的流程吗?请简单描述:首先创建一个线程,读nValue的值,然后nValue值加一后,将nValue值重新写入文件。重复上述过程100次。2、演示使用映射文件的内存交换数据的线程阅读和分析程序,请回答:1) 程序中用来创建一个文件映射对象的系统API函数是哪个? CreateFileMapping();2) 在文件映射上创建和关闭文件视图分别使用了哪一个系统函数?a.MapViewOfFile()b.UnmapViewOfFile()3) 运行时,程序首先通过 (MakeSharedFile(); ) 函数创建一个小型的文件映射对象 ( hMapping) ,接着,使用系统API函数 ( CreateMutex();) 再创建一个保护其应用的互斥体 ( g_hMutexMapping ) 。然后,应用程序创建100个线程,每个都允许进行同样的进程,即:通过互斥体获得访问权,这个操作是由语句:_WaitForSingleObject(g_hMutexMapping, INFINITE);实现的。再通过函数 ( MapViewOfFile(); ) 操作将视图映射到文件,将高32位看作有符号整数,将该数值增加 (即命令:+(*pnData); ) ,再将新数值显示在控制台上。每个线程清除文件的视图并在退出之前释放互斥体的语句是ReleaseMutex(g_hMutexMapping);。当线程完成时,应用程序关闭并退出。4) 将程序中的语句 : Sleep(500) ; 删除 (例如在语句前面加上“/”) 后,重新编译运行,结果有变化吗?为什么?有变化。100个线程一闪而过,不能看清结果。因为Sleep(500)是为了放慢速度,方便观察。四、实验总结请总结一下本次实验的收获、教训和感受,结合课本内容谈一下你对进程间控制的理解。本次实验让我明白了操作系统中的事件和互斥体对象,以及线程同步的概念。学习了进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。当多个进程并发执行时,若我们不指定进程之间并发的顺序,则他们可以任意并发,当这些进程没有访问互斥元素时,运行结果不会出现错误,但是当多个进程访问同一个互斥体时,就会出现错误,这时我们必须通过某种手段来同步进程间并发的顺序,这便是进程间的同步问题。还有,并发执行的进程或线程间,有时为了需要,会相互之间进行数据的交换,即进程间通信,Windows中,可以通过文件对象在线程间发送数据。还可以使用映射文件的内存交换数据。实验三 生产者-消费者算法模拟实验一、实验目的1、掌握基本的互斥与同步算法,进一步理解“生产者-消费者”模型。2、通过对“生产者-消费者”问题编程实现,了解线程创建、同步信号量、互斥信号量、临界区的创建和使用,初步了解并发程序设计方法。3、进一步理解P、V原语和信号量在线程互斥和同步机制中的运用。二、实验内容和步骤1、在本次实验开始,以“生产者-消费者”模型为依据,提供了一个多线程“生产者-消费者”实例,有部分源程序代码,要求读者分析已编制的一个“生产者-消费者”实例,并将其缺失的程序代码补充完整,然后调试这段程序,得出最终的结果,并分析结果,得出相应的结论。尝试改变一些参数,例如:改变缓冲区数、增加(减少)线程数、改变延迟数、增加(减少)生产者进程、增加(减少)消费者进程、改变消费者进程的请求序列等内容,考察这些改变对于运行结果的影响。3、参考部分源程序代码:1、empty_semaphore=CreateSemaphore(NULL,n_Buffer_or_Critical,n_Buffer_or_Critical, semaphore_for_empty);2、h_mutex=CreateMutex(NULL,FALSE,mutex_for_update);3、h_Semaphorej+1=CreateSemaphore(NULL,0,n_Thread,lp.c_str();4、h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Produce),&(Thread_Infoi),0,NULL);5、h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consume),&(Thread_Infoi),0,NULL);6、ReleaseMutex(h_mutex);7、ReleaseSemaphore(h_Semaphorem_serial,n_Thread,NULL);8、EnterCritialSection(&PC_CriticalBufferPos);9、ReleaseSemaphore(empty_semaphore,1,NULL);10、LeaveCriticalSection(&PC_CriticalBufferPos);4、请补全上述程序,写出程序的运行结果。程序运行结果如下图所示。5、 分析程序的运行结果。首先生产者3生产了产品3,然后生产者1生产了产品1,最后生产者4生产了产品4.消费时,消费者5消费产品3,然后消费2消费产品1,最后消费者5消费产品4.四、实验总结请总结一下本次实验的收获、教训和感受,结合课本内容谈一下你对进程间控制的理解。深刻了解了生产者消费者进程,进一步理解了“生产者-消费者”模型。进一步理解P、V原语和信号量在线程互斥和同步机制中的运用,我进一步明白了进程间同步的概念。我也进一步掌握了基本的互斥与同步算法,特别是生产者消费者算法。我也学会了如何通过Windows中的同步信号量、互斥信号量的创建和使用,来实现进程之间或线程之间的同步与互斥。还有临界区的创建和使用,线程的创建。 实验四 页式存储管理部分功能模拟一、实验目的 (1)了解存储器的管理任务和功能 (2)了解 Windows 存储器管理模式和特点 (3)深入了解页式存储管理如何实现地址转换 (4)进一步认识页式存储管理中如何处理缺页中断 (5)掌握几种页面置换算法的实现方法 二、实验内容和步骤 1、实验内容 1、j = phead;2、phead = lnumber;3、head = (head + 1) % m;4、if(pagej.write = 1) 5、pagej.flag = 0;6、pagelnumber.flag = 1;7、pagelnumber.write = 0;8、pagelnumber.pnumber = pagej.pnumber;9、pagej.pnumber,10、j, 11、pagelnumber.dnumber, 12、Lnumber13、lnumber = laddress 10; /分离逻辑地址14、ad = laddress & 0x03FF;15、 page_interrupt(lnumber); 16、 pnumber = pagelnumber.pnumber;17、 paddress = pnumber dev1 使用 cat 命令显示主目录中 dev1 文件的内容。文本的显示出现了什么情况? 文件的所有内容都显示出来了,屏幕自动换行。 步骤 7:使用 more 命令显示文件的内容。 使用 more 命令显示主目录中 dev1 文件的内容。文本的显示出现了什么情况? 只显示最开始的一屏。 步骤 8:使用 head 命令显示文件的一部分。 1) 单独使用head 命令,显示主目录中 dev1 文件的开始部分。显示了多少行? 10 2) 使用带 -n 选项的head 命令,显示主目录中 dante 文件的前20 行。您输入什么命令? head -20 dante 步骤 9:使用 tail 命令显示文件的一部分。 单独使用 tail命令,显示主目录中 dante 文件的末端。显示了多少行? 10 步骤 10:通过使用 wc 命令,确定行数、单词数和字符数。 使用 wc 命令确定主目录中 dev1 文件的行数、单词数和字符数。有多少行、多少个单词和多少个字符?205行, 205个单词, 1238个字符。步骤 11:使用 wc 计算目录条目的数目。 更多符号是竖线,和后斜线 () 在同一个键上。在命令行提示行下,输入命令 ls l wc -w。有多少个文件和目录名 (单词) ? 24 步骤 12:使用 diff命令确定文件之间的不同之处。 使用 diff命令执行细节比较,确定 fruit1 文件和 fruit2 文件之间的区别。 在 fruit1 文件和在 fruit2 文件中,哪几行是不同的? 1c1.2fruit1:bananafruit2:banane1) cat 命令: 对 fruit1文件使用 cat命令。 对 fruit2文件使用 cat命令。 键入命令行 cat fruit1 fruit2 filex。 对 filex 文件使用 cat 命令。上面的命令行做了什么工作? 将fruit1和fruit2两个文件合并,并且写入文件filex。 2) 可以使用哪 2 个命令来确定 2 个文件是否相同? diff。2. 基本的命令行文件管理 步骤 14:回顾 Linux 的文件和目录命名规则。 表7-1 实验记录 文件名 是否为Linux 文件或目录名 为什么是或为什么不是 12345abcde678 是只有字母和数字Hobbies: 2 是只有字母、数字和“;”Adcd-123 是只有字母、数字和-Sales*repts*2001 是,但不推荐有*D.projects.bj.2001 是只有字母、数字和.Projects1.bj-2001 否与号 步骤 15:使用 touch 命令创建文件。 命令格式: touch filename (s) 1) 在主目录中使用 touch命令创建一个名为 newfile 的文件,应该使用什么命令? touch newfile 2) 使用 touch 命令在这个目录中创建另一个叫做 filenew的新文件,应该使用什么命令? touch filenew3) 输入命令显示 practice目录中的文件的长列表。创建的文件列出来了吗? 列出来了 4) 谁是文件的所有者? fuxin 当前登录的用户 5) 和文件关连的组是什么? 用户组 6) 创建的日期和时间是什么? 2011-12-10 16:02 7) 文件的大小是多少? 0 8) 使用 file命令确定 newfile的文件类型。它是哪一类的文件? newfile:empty 9) 使用 touch 命令同时创建 3 个文件:new1、new2 和new3,应该使用什么命令? touch new1 new2 new3 10) 输入命令显示 practice目录中文件的长列表。创建的 3 个新文件列出来了吗? 列出来了 步骤 16:使用 mkdir命令创建新目录。 mkdir directory_name (s) 1) 从主目录中,使用相对路径名改变到 practice目录中。使用什么命令? cd practice2) 使用 mkdir命令,在这个目录中创建一个叫做 newdir 的子目录。使用什么命令? mkdir newdir 3) 输入命令,显示 practice 目录中文件和目录的长列表。创建的目录列出来了吗? 列出来了4) 目录的所有者是? fuxin当前登录的用户。 5) 文件的大小是多少?40966) 使用 file命令确定 newdir文件的类型。它是哪一类的文件? newdir:directory 目录 7) 如果名字中没有字符 dir,采取别的什么方法来识别出它是一个目录? 文件名显示为蓝色,文件属性第一个字母为“d” 8) mkdir命令创建 3 个目录,目录名分别为 high、medium和 low,应该使用什么命令? mkdir high medium low 9) 用 ls 命令检查创建是否成功? 成功步骤 17:使用 rm命令删除文件。 rm -i filename (s) 1) 使用 rm命令删除早先在 practice目录中创建的 newfile 文件,应该使用什么命令? rm newfile 2) 输入命令显示 practice目录中文件的长列表。创建的文件还在吗? 不在了 3) 使用带 -i 选项的 rm 命令,删除早先在 practice 目录中创建的 filenew 文件。交互式选项起到什么作用? 会提示用户 rm : remove regular empty file filenew? 按下Enter键删除文件,防止用户误删文件。 4) 删除早先创建的三个名为 new1、new2 和new3 的文件。使用问号 (?) 通配符使用一个命令删除所有三个文件。使用什么命令? rm new? 5) 输入命令,显示 practice 目录中文件的长列表。三个文件还在吗? 不在了 6) 还有其他的什么方法来删除 new1、new2 和new3 文件? rm new1 new2 new3 步骤 18:使用 rm -r 命令删除目录。 rm r i directory_name (s) 1) 删除早先创建的 newdir子目录,使用什么命令? rm -r newdir2) 输入命令显示 practice目录中文件的长列表,创建的子目录还在吗? 不在了 3) 改变到早先创建的 mediurn 子目录中,输入什么命令? cd medium 4) 删除早先创建的 low子目录,使用什么命令? rm -r low 5) 用相对路径名和快捷方式,改变回到 practice子目录中,应使用什么命令? cd . 6) 使用一个命令删除 high 和 mediu
收藏
编号:2613996
类型:共享资源
大小:284.38KB
格式:DOC
上传时间:2020-04-24
8
金币
- 关 键 词:
-
河北
工业大学
操作
技巧
技能
系统
实验
试验
报告
讲演
呈文
- 资源描述:
-
-/
河北工业大学
操作系统
2014版
实验报告
实验一 进程控制与描述
一、实验目的
通过对Windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows 2000的结构。通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000进程的“一生”。
三、实验内容和步骤
第一部分:
Windows 2000 Professional下的GUI应用程序,使用Visual C++编译器创建一个GUI应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。
程序1-1 Windows 2000的GUI应用程序
也可以利用任何其他文本编辑器键入程序代码,如果这样,例如使用WORD来键入和编辑程序,则应该注意什么问题?保存时,将文件保存为扩展名为*.cpp的C++源文件。
在程序1-1的GUI应用程序中,首先需要Windows.h头文件,以便获得传送给WinMain() 和MessageBox() API函数的数据类型定义。
接着的pragma指令指示编译器/连接器找到User32.LIB库文件并将其与产生的EXE文件连接起来。这样就可以运行简单的命令行命令CL MsgBox.CPP来创建这一应用程序,如果没有pragma指令,则MessageBox() API函数就成为未定义的了。这一指令是Visual Studio C++ 编译器特有的。
接下来是WinMain() 方法。其中有四个由实际的低级入口点传递来的参数。hInstance参数用来装入与代码相连的图标或位图一类的资源,无论何时,都可用GetModuleHandle() API函数将这些资源提取出来。系统利用实例句柄来指明代码和初始的数据装在内存的何处。句柄的数值实际上是EXE文件映像的基地址,通常为0x00400000。下一个参数hPrevInstance是为向后兼容而设的,现在系统将其设为NULL。应用程序的命令行 (不包括程序的名称) 是lpCmdLine参数。另外,系统利用nCmdShow参数告诉应用程序如何显示它的主窗口 (选项包括最小化、最大化和正常) 。
最后,程序调用MessageBox() API函数并退出。如果在进入消息循环之前就结束运行的话,最后必须返回0。
运行结果:
弹出一个消息框,标题为Greetings,内容为Hello,Windows Xp,中间有一个确认按钮。
进程对象
操作系统将当前运行的应用程序看作是进程对象。利用系统提供的惟一的称为句柄 (HANDLE) 的号码,就可与进程对象交互。这一号码只对当前进程有效。
本实验表示了一个简单的进程句柄的应用。在系统中运行的任何进程都可调用GetCurrentProcess() API函数,此函数可返回标识进程本身的句柄。然后就可在Windows需要该进程的有关情况时,利用这一句柄来提供。
程序1-2: 获得和使用进程的句柄
程序1-2中列出的是一种获得进程句柄的方法。对于进程句柄可进行的惟一有用的操作是在API调用时,将其作为参数传送给系统,正如程序1-2中对GetPriorityClass() API函数的调用那样。在这种情况下,系统向进程对象内“窥视”,以决定其优先级,然后将此优先级返回给应用程序。
OpenProcess() 和CreateProcess() API函数也可以用于提取进程句柄。前者提取的是已经存在的进程的句柄,而后者创建一个新进程,并将其句柄提供出来。
1-2.cpp的运行结果:
进程优先权为Normal。
程序1-3显示如何找出系统中正在运行的所有进程,如何利用OpenProcess() API函数来获得每一个访问进程的进一步信息。
程序1-3 利用句柄查出进程的详细信息
程序1-3程序首先利用Windows 2000的新特性,即工具帮助库来获得当前运行的所有进程的快照。然后应用程序进入快照中的每一个进程,得到其以PROCESSENTRY32结构表示的属性。这一结构用来向OpenProcess() API函数提供进程的ID。Windows跟踪每一进程的有关时间,示例中是通过打开的进程句柄和GetProcessTimes() API来直询得到有关时间的。接下来,一个定制的帮助函数取得了几个返回的数值,然后计算进程在内核模式下消耗的时间占总时间的百分比。程序的其余部分比较简单,只是将有关信息显示给用户,清除进程句柄,然后继续循环,直到所有进程都计算过为止。
运行结果:
第二部分:进程的“一生”
1、 创建进程
创建子进程
本程序展示的是一个简单的使用CreateProcess() API函数的例子。首先形成简单的命令行,提供当前的EXE文件的指定文件名和代表生成克隆进程的号码。大多数参数都可取缺省值,但是创建标志参数使用了:行为像一个子进程的标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标记。然后该克隆进程的创建方法关闭传递过来的句柄并返回main() 函数。在关闭程序之前,每一进程的执行主线程暂停一下,以便让用户看到其中的至少一个窗口。
CreateProcess() 函数有 5 个核心参数?本实验程序中设置的各个参数的值是:
a. (LPCTSTR lpApplicationName) szFilename, // 产生这个EXE的应用程序的名称;
b. (LPTSTR lpCommandLine) szCmdLine, // 告诉其行为像一个子进程的标志;
c. (BOOL bInheritHandles) FALSE, // 不继承句柄;
d. (LPSTARTUPINFO lpStartupInfo) &si, // 启动信息;
e. (LPPROCESS_INFORMATION lpProcessInformation) &pi); // 返回的进程信息;
程序运行时屏幕显示的信息是:
2、 正在运行的进程
使用进程和操作系统的版本信息
运行结果:
当前PID信息:_4664
当前操作系统版本:5.1(我的操作系统为Windows XP)
系统提示信息:Task Manager should now now indicate this process is high priority.
程序向读者表明了如何获得当前的PID和所需的进程版本信息。为了运行这一程序,系统处理了所有的版本不兼容问题。
接着,程序演示了如何使用GetVersionEx() API函数来提取OSVERSIONINFOEX结构。这一数据块中包括了操作系统的版本信息。其中,“OS : 5.0”表示当前运行的操作系统是:Windows 2000。最后一段程序利用了操作系统的版本信息,以确认运行的是Windows 2000。代码接着将当前进程的优先级提高到比正常级别高。
单击Ctrl + Alt + Del键,进入“Windows任务管理器”,在“应用程序”选项卡中右键单击本任务,在快捷菜单中选择“转到进程”命令。
在“Windows任务管理器”的“进程”选项卡中,与本任务对应的进程映像名称是 (为什么?) :
VCSPAWN.EXE
右键单击该进程名,在快捷菜单中选择“设置优先级”命令,可以调整该进程的优先级,如设置为“高”后重新运行程序,屏幕显示有变化吗? 没有。
3、 终止进程
指令其子进程来“杀掉”自己的父进程
程序说明了一个进程从“生”到“死”的整个一生。第一次执行时,它创建一个子进程,其行为如同“父亲”。在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。当创建子进程时,就打开了互斥体并在其他线程中进行别的处理工作,同时等待着父进程使用ReleaseMutex() API发出“死亡”信号。然后用Sleep() API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。
当调用ExitProcess() 时要小心,进程中的所有线程都被立刻通知停止。在设计应用程序时,必须让主线程在正常的C++ 运行期关闭 (这是由编译器提供的缺省行为) 之后来调用这一函数。当它转向受信状态时,通常可创建一个每个活动线程都可等待和停止的终止事件。
在正常的终止操作中,进程的每个工作线程都要终止,由主线程调用ExitProcess()。接着,管理层对进程增加的所有对象释放引用,并将用 GetExitCodeProcess() 建立的退出代码从STILL_ACTIVE改变为在ExitProcess() 调用中返回的值。最后,主线程对象也如同进程对象一样转变为受信状态。
等到所有打开的句柄都关闭之后,管理层的对象管理器才销毁进程对象本身。还没有一种函数可取得终止后的进程对象为其参数,从而使其“复活”。当进程对象引用一个终止了的对象时,有好几个API函数仍然是有用的。进程可使用退出代码将终止方式通知给调用GetExitCodeProcess() 的其他进程。同时,GetProcessTimes() API函数可向主调者显示进程的终止时间。
运行结果:
1) _Creating the child process._
Child waiting for suicide instructions.
表示:_父进程正在创建子进程。子进程等待父进程杀死子进程。_
2) _Telling the child process to quit.__
表示:_父进程杀死子进程。_
四、实验总结
请总结一下本次实验的收获、教训和感受,结合课本内容谈一下你对进程的理解。
本次实验让我明白进程是程序的一次执行过程,是系统进行处理机调度和资源分配的基本单位。(未引入线程之前)。进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元,对父进程和子进程的关系有了进一步的了解。
实验二 并发与调度
1、 实验目的
在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000线程同步的理解。通过分析实验程序,了解管理事件对象的API。了解在进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。
二、实验内容和步骤
第一部分:互斥体对象
本程序中显示的类CCountUpDown使用了一个互斥体来保证对两个线程间单一数值的访问。每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。创建者实际上创建的是互斥体对象,计数方法执行等待并释放,为的是共同使用互斥体所需的资源 (因而也就是共享资源) 。
1、利用互斥体保护共享资源
分析程序的运行结果,可以看到线程 (加和减线程) 的交替执行 (因为Sleep() API允许Windows切换线程) 。在每次运行之后,数值应该返回初始值 (0) ,因为在每次运行之后写入线程在等待队列中变成最后一个,内核保证它在其他线程工作时不会再运行。
1) 请描述运行结果 (如果运行不成功,则可能的原因是什么?) :
两个线程交替运行,不断改变value的值。两个线程互斥访问Value的值。
2) 根据运行输出结果,对照分析程序,可以看出程序运行的流程吗?请简单描述:
线程1(5296)先运行,将value值增1,变为1。然后,线程2(6016)运行,将value值减1,变为0.
第二部分:线程通过文件对象发送数据
Windows 2000提供的线程间通讯类内核对象允许同一进程或跨进程的线程之间互相发送信息,包括文件、文件映射、邮件位和命名管道等,其中最常用的是文件和文件映射。这类对象允许一个线程很容易地向同一进程或其他进程中的另一线程发送信息。
1、演示线程通过文件对象发送数据
运行结果 (如果运行不成功,则可能的原因是什么?) :
阅读和分析程序,请回答问题:
1) 程序中启动了多少个单独的读写线程?
100
2) 使用了哪个系统API函数来创建线程例程?
CreateThread()
3) 文件的读和写操作分别使用了哪个API函数?
ReadFile() WriteFile()
每次运行进程时,都可看到程序中的每个线程从前面的线程中读取数据并将数据增加,文件中的数值连续增加。这个示例是很简单的通讯机制。可将这一示例用作编写自己的文件读/写代码的模板。
请注意程序中写入之前文件指针的重置。重置文件指针是必要的,因为该指针在读取结束时将处于前四个字节之后,同一指针还要用于向文件写入数据。如果函数向该处写入新数值,则下次进程运行时,只能读到原来的数值。那么:
4) 在程序中,重置文件指针使用了哪一个函数?
SetFilePointer()
5) 从输出结果,对照分析程序,可以看出程序运行的流程吗?请简单描述:
首先创建一个线程,读nValue的值,然后nValue值加一后,将nValue值重新写入文件。重复上述过程100次。
2、演示使用映射文件的内存交换数据的线程
阅读和分析程序,请回答:
1) 程序中用来创建一个文件映射对象的系统API函数是哪个?
CreateFileMapping();
2) 在文件映射上创建和关闭文件视图分别使用了哪一个系统函数?
a.MapViewOfFile()
b.UnmapViewOfFile()
3) 运行时,程序首先通过 (MakeSharedFile(); ) 函数创建一个小型的文件映射对象 ( hMapping) ,接着,使用系统API函数 ( CreateMutex();) 再创建一个保护其应用的互斥体 ( g_hMutexMapping ) 。然后,应用程序创建100个线程,每个都允许进行同样的进程,即:通过互斥体获得访问权,这个操作是由语句:_WaitForSingleObject(g_hMutexMapping, INFINITE);实现的。再通过函数 ( MapViewOfFile(); ) 操作将视图映射到文件,将高32位看作有符号整数,将该数值增加 (即命令:++(*pnData); ) ,再将新数值显示在控制台上。每个线程清除文件的视图并在退出之前释放互斥体的语句是ReleaseMutex(g_hMutexMapping);。当线程完成时,应用程序关闭并退出。
4) 将程序中的语句 :: Sleep(500) ; 删除 (例如在语句前面加上“//”) 后,重新编译运行,结果有变化吗?为什么?
有变化。100个线程一闪而过,不能看清结果。
因为Sleep(500)是为了放慢速度,方便观察。
四、实验总结
请总结一下本次实验的收获、教训和感受,结合课本内容谈一下你对进程间控制的理解。
本次实验让我明白了操作系统中的事件和互斥体对象,以及线程同步的概念。学习了进程中如何使用事件对象,在进程中如何使用互斥体对象,线程如何通过文件映射对象发送数据。当多个进程并发执行时,若我们不指定进程之间并发的顺序,则他们可以任意并发,当这些进程没有访问互斥元素时,运行结果不会出现错误,但是当多个进程访问同一个互斥体时,就会出现错误,这时我们必须通过某种手段来同步进程间并发的顺序,这便是进程间的同步问题。
还有,并发执行的进程或线程间,有时为了需要,会相互之间进行数据的交换,即进程间通信,Windows中,可以通过文件对象在线程间发送数据。还可以使用映射文件的内存交换数据。
实验三 生产者-消费者算法模拟实验
一、实验目的
1、掌握基本的互斥与同步算法,进一步理解“生产者-消费者”模型。
2、通过对“生产者-消费者”问题编程实现,了解线程创建、同步信号量、互斥信号量、临界区的创建和使用,初步了解并发程序设计方法。
3、进一步理解P、V原语和信号量在线程互斥和同步机制中的运用。
二、实验内容和步骤
1、在本次实验开始,以“生产者-消费者”模型为依据,提供了一个多线程“生产者-消费者”实例,有部分源程序代码,要求读者分析已编制的一个“生产者-消费者”实例,并将其缺失的程序代码补充完整,然后调试这段程序,得出最终的结果,并分析结果,得出相应的结论。
尝试改变一些参数,例如:改变缓冲区数、增加(减少)线程数、改变延迟数、增加(减少)生产者进程、增加(减少)消费者进程、改变消费者进程的请求序列等内容,考察这些改变对于运行结果的影响。
3、参考部分源程序代码:
1、empty_semaphore=CreateSemaphore(NULL,n_Buffer_or_Critical,n_Buffer_or_Critical,
"semaphore_for_empty");
2、h_mutex =CreateMutex(NULL,FALSE,"mutex_for_update");
3、h_Semaphore[j+1]=CreateSemaphore(NULL,0,n_Thread,lp.c_str());
4、h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Produce),
&(Thread_Info[i]),0,NULL);
5、h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consume),
&(Thread_Info[i]),0,NULL);
6、ReleaseMutex(h_mutex);
7、ReleaseSemaphore(h_Semaphore[m_serial],n_Thread,NULL);
8、EnterCritialSection(&PC_Critical[BufferPos]);
9、ReleaseSemaphore(empty_semaphore,1,NULL);
10、LeaveCriticalSection(&PC_Critical[BufferPos]);
4、请补全上述程序,写出程序的运行结果。程序运行结果如下图所示。
5、 分析程序的运行结果。
首先生产者3生产了产品3,然后生产者1生产了产品1,最后生产者4生产了产品4.
消费时,消费者5消费产品3,然后消费2消费产品1,最后消费者5消费产品4.
四、实验总结
请总结一下本次实验的收获、教训和感受,结合课本内容谈一下你对进程间控制的理解。
深刻了解了生产者消费者进程,进一步理解了“生产者-消费者”模型。进一步理解P、V原语和信号量在线程互斥和同步机制中的运用,我进一步明白了进程间同步的概念。我也进一步掌握了基本的互斥与同步算法,特别是生产者消费者算法。我也学会了如何通过Windows中的同步信号量、互斥信号量的创建和使用,来实现进程之间或线程之间的同步与互斥。还有临界区的创建和使用,线程的创建。
实验四 页式存储管理部分功能模拟
一、实验目的
(1)了解存储器的管理任务和功能
(2)了解 Windows 存储器管理模式和特点
(3)深入了解页式存储管理如何实现地址转换
(4)进一步认识页式存储管理中如何处理缺页中断
(5)掌握几种页面置换算法的实现方法
二、实验内容和步骤
1、实验内容
1、j = p[head];
2、p[head] = lnumber;
3、head = (head + 1) % m;
4、if(page[j].write == 1)
5、page[j].flag = 0;
6、page[lnumber].flag = 1;
7、page[lnumber].write = 0;
8、page[lnumber].pnumber = page[j].pnumber;
9、page[j].pnumber,
10、j,
11、page[lnumber].dnumber,
12、Lnumber
13、lnumber = laddress >> 10; //分离逻辑地址
14、ad = laddress & 0x03FF;
15、 page_interrupt(lnumber);
16、 pnumber = page[lnumber].pnumber;
17、 paddress = pnumber << 10 | ad;
18、 page_interrupt(lnumber);
19、 page[i].lnumber = lnumber;
20、 page[i].flag = 0;
21、 page[i].write = 0;
22、 page[i].dnumber = dnumber;
23、 i++;
24、 page[m].pnumber = pnumber;
25、 page[m].flag = 1;
26、 p[m] = m;
27、 m ++;
28、 command(laddress, write);
2、程序运行结果及简要分析
结果分析:
首先输入页号和辅存地址,如上图,输入1、1000,2、2000,3、3000,4、4000,5、5000.
然后输入主存块号,确定主存块数为2,主存块数分别是1、2.
最后,我们就可以模拟程序运行了,首先输入了一条需要修改内存的指令,逻辑地址为1000,因为没有在内存里,因此发生缺页中断,执行中断服务程序,淘汰主存块1中的页,从磁盘第5000块中调入页4。第二次输入0 2000,依然发生缺页中断。第三次时,输入1 3000,此时淘汰的页4修改过,因此要将页4写回磁盘第5000块。其他类似。
三、实验总结
请总结一下本次实验的收获、教训和感受,结合课本相关内容谈一下你对 Windows 2000
内存管理的理解。
通过本实验我了解了请求页式存储的基本实现,用户应用进程以32位虚拟地址方式编址,每个虚拟地址与一个称作“页表端”的结构有关,它包含了虚拟地址映射的物理地址,了解了虚拟存储器的工作原理,以及虚存如何在操作系统中实现的。还有就是,当发生缺页中断时,操作系统如何将外部磁盘中的信息调入内存中,在调入内存中之前,先用页面置换算法将每一页置换出去。内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。
实验五 设备管理模拟实验
一、实验目的
(1) 了解 Windows 操作系统中设备驱动程序的组成
(2) 理解 Windows 操作系统的设备管理机制
(3) 掌握 Windows 操作系统关于设备管理的 API 函数的使用方法
(4) 了解并掌握 Windows 中鼠标、键盘等简单设备的检测方法
二、实验内容和步骤
1、SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP,0,NULL,NULL);//鼠标改为右手习惯
2、SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP,1,NULL,NULL);//鼠标改为左手习惯
3、iFunctionKeynum = GetKeyboardType(2);
4、Beep(iFreq[j], 300);
三、程序运行结果及简要分析
结果分析:通过输入1、2、3、4、分别选择鼠标改为右手习惯,鼠标改为左手习惯,获得键盘类型和功能键个数,喇
叭播放音乐等功能。如上图,我选择了选项3,图显示我的键盘类型为IBM增强型(101或101键)键盘,功能键个数为12.
四、实验总结
请总结一下本次实验的收获、教训和感受,结合课本相关内容谈一下你对 Windows 2000设备管理的理解。
设备管理的主要任务是控制设备和CPU之间进行I/O操作,满足用户I/O请求,满足用户I/O请求。设备管理的主要任务是要尽可能的提高CPU和I/O设备之间、I/O设备和I/O设备之间的并行性以及I/O设备的利用率,从而使包括I/O设备的系统资源获得最佳使用效率。Windows设备驱动程序是一种可以安装有Windows操作系统的计算机和外部设备之间通信的特殊程序,可以说相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。
实验六 文件系统
1、 实验目的
通过本实验,要求学生熟练掌握 Linux 各种文件操作命令,包括:使用控制字符执行特殊功能;使用 file 和strings命令确定文件类型;使用 cat 利more 命令显示文本文件的内容;使用head 和 tail 命令显示文本文件的部分内容;使用 wc 命令确定单词、行和字符数;使用 diff 命令比较 2 个文件;回顾文件和目录命名约定;使用 touch命令创建新文件;使用 mkdir 命令创建新目录;使用 rm 命令删除文件;使用 rm -r 命令删除目录。
三、实验内容和步骤
1. 文件信息命令
Ctrl + Z:终止当前活动。显示 ls 命令的手册页面 (man ls) ,然后使用 Ctrl -z 中止输出。 当你接下 Ctrl + Z 的时候,发生了什么事情?
退出帮助,返回shell提示符
当使用计算器的时候,你的提示符是什么?
fuxin@fuxin-K42JZ:~$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty.
无提示符。(我的Linux系统为Ubuntu11.10)
如果输入一个命令,如 ls –R/,有时候,会在按下回车键之前想擦除命令行。输入一个命令,在接下回车键执行命令之前按下 Ctrl + U。结果是什么?
输入的命令被消除了
使用 file 命令来确定 test文件的文件类型。它是哪种类型的文件?
test:ASCII text
2) 可执行 (或二进制) 文件:包括 32 位的可执行文件和可扩展链接格式(ELF) 编码文件,和其他动态链接的可执行文件。这种文件类型表示这个文件是一个命令或程序。
使用 file 命令确定你所建立的文件类型。它是哪种类型的文件?(注意文件名部分必须包括扩展名,如 file ww.sxw 。)
ww.odt Open Document Text(我的电脑上装的是LibreOffice)
步骤 5:使用 strings 命令。
使用 strings命令查看 /usr/bin/cal 文件的可读字符。列出 strings 命令中的一些输出。
fuxin@fuxin-K42JZ:~$ strings /usr/bin/cal
/lib/ld-linux.so.2
libncurses.so.5
__gmon_start__
_Jv_RegisterClasses
tgetent
步骤 6:使用 cat 命令显示文件的内容。
键入 ls /dev > dev1
使用 cat 命令显示主目录中 dev1 文件的内容。文本的显示出现了什么情况?
文件的所有内容都显示出来了,屏幕自动换行。
步骤 7:使用 more 命令显示文件的内容。
使用 more 命令显示主目录中 dev1 文件的内容。文本的显示出现了什么情况?
只显示最开始的一屏。
步骤 8:使用 head 命令显示文件的一部分。
1) 单独使用head 命令,显示主目录中 dev1 文件的开始部分。显示了多少行?
10
2) 使用带 -n 选项的head 命令,显示主目录中 dante 文件的前20 行。您输入什么命令?
head -20 dante
步骤 9:使用 tail 命令显示文件的一部分。
单独使用 tail命令,显示主目录中 dante 文件的末端。显示了多少行?
10
步骤 10:通过使用 wc 命令,确定行数、单词数和字符数。
使用 wc 命令确定主目录中 dev1 文件的行数、单词数和字符数。有多少行、多少个单词和多少个字符?
205行, 205个单词, 1238个字符。
步骤 11:使用 wc 计算目录条目的数目。
更多符号是竖线,和后斜线 (\) 在同一个键上。在命令行提示行下,输入命令 ls l wc -w。有多少个文件和目录名 (单词) ?
24
步骤 12:使用 diff命令确定文件之间的不同之处。
使用 diff命令执行细节比较,确定 fruit1 文件和 fruit2 文件之间的区别。
在 fruit1 文件和在 fruit2 文件中,哪几行是不同的?
1c1.2
fruit1:banana
fruit2:banane
1) cat 命令:
对 fruit1文件使用 cat命令。
对 fruit2文件使用 cat命令。
键入命令行 cat fruit1 fruit2 > filex。
对 filex 文件使用 cat 命令。上面的命令行做了什么工作?
将fruit1和fruit2两个文件合并,并且写入文件filex。
2) 可以使用哪 2 个命令来确定 2 个文件是否相同?
diff。
2. 基本的命令行文件管理
步骤 14:回顾 Linux 的文件和目录命名规则。
表7-1 实验记录
文件名
是否为Linux 文件或目录名
为什么是或为什么不是
12345abcde678
是
只有字母和数字
Hobbies: 2
是
只有字母、数字和“;”
Adcd-123
是
只有字母、数字和-
Sales*repts*2001
是,但不推荐
有*
D.projects.bj.2001
是
只有字母、数字和.
Projects>1.bj-2001
否
与‘>’号
步骤 15:使用 touch 命令创建文件。
命令格式:
touch filename (s)
1) 在主目录中使用 touch命令创建一个名为 newfile 的文件,应该使用什么命令?
touch newfile
2) 使用 touch 命令在这个目录中创建另一个叫做 filenew的新文件,应该使用什么命令?
touch filenew
3) 输入命令显示 practice目录中的文件的长列表。创建的文件列出来了吗?
列出来了
4) 谁是文件的所有者?
fuxin 当前登录的用户
5) 和文件关连的组是什么?
用户组
6) 创建的日期和时间是什么?
2011-12-10 16:02
7) 文件的大小是多少?
0
8) 使用 file命令确定 newfile的文件类型。它是哪一类的文件?
newfile:empty
9) 使用 touch 命令同时创建 3 个文件:new1、new2 和new3,应该使用什么命令?
touch new1 new2 new3
10) 输入命令显示 practice目录中文件的长列表。创建的 3 个新文件列出来了吗?
列出来了
步骤 16:使用 mkdir命令创建新目录。
mkdir directory_name (s)
1) 从主目录中,使用相对路径名改变到 practice目录中。使用什么命令?
cd practice
2) 使用 mkdir命令,在这个目录中创建一个叫做 newdir 的子目录。使用什么命令?
mkdir newdir
3) 输入命令,显示 practice 目录中文件和目录的长列表。创建的目录列出来了吗?
列出来了
4) 目录的所有者是?
fuxin当前登录的用户。
5) 文件的大小是多少?
4096
6) 使用 file命令确定 newdir文件的类型。它是哪一类的文件?
newdir:directory 目录
7) 如果名字中没有字符 dir,采取别的什么方法来识别出它是一个目录?
文件名显示为蓝色,文件属性第一个字母为“d”
8) mkdir命令创建 3 个目录,目录名分别为 high、medium和 low,应该使用什么命令?
mkdir high medium low
9) 用 ls 命令检查创建是否成功?
成功
步骤 17:使用 rm命令删除文件。
rm [-i] filename (s)
1) 使用 rm命令删除早先在 practice目录中创建的 newfile 文件,应该使用什么命令?
rm newfile
2) 输入命令显示 practice目录中文件的长列表。创建的文件还在吗?
不在了
3) 使用带 -i 选项的 rm 命令,删除早先在 practice 目录中创建的 filenew 文件。交互式选项起到什么作用?
会提示用户 rm : remove regular empty file filenew? 按下Enter键删除文件,防止用户误删文件。
4) 删除早先创建的三个名为 new1、new2 和new3 的文件。使用问号 (?) 通配符使用一个命令删除所有三个文件。使用什么命令?
rm new?
5) 输入命令,显示 practice 目录中文件的长列表。三个文件还在吗?
不在了
6) 还有其他的什么方法来删除 new1、new2 和new3 文件?
rm new1 new2 new3
步骤 18:使用 rm -r 命令删除目录。
rm –r [i] directory_name (s)
1) 删除早先创建的 newdir子目录,使用什么命令?
rm -r newdir
2) 输入命令显示 practice目录中文件的长列表,创建的子目录还在吗?
不在了
3) 改变到早先创建的 mediurn 子目录中,输入什么命令?
cd medium
4) 删除早先创建的 low子目录,使用什么命令?
rm -r low
5) 用相对路径名和快捷方式,改变回到 practice子目录中,应使用什么命令?
cd ..
6) 使用一个命令删除 high 和 mediu
展开阅读全文
淘文阁 - 分享文档赚钱的网站所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。