您的当前位置:首页正文

Linu并发程序设计实习报告

2020-04-30 来源:欧得旅游网
实习报告:Linux并发程序设计 学生姓名:张云龙 班级:12软工A2 学号:20143430134 一、实习内容 1、Linux进程控制 调试上面7.1 Linux进程控制的各程序代码。 1〉 示例:使用系统调用fork(),创建新进程。 《一》 在linux中打开vi编辑器,新建一个c程序,名字叫做7.1。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出! 《二》。然后在提示符$后输入命令:gcc –g 7.1.c –o 7.1对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.1对程序进行编译执行! 《三》通过测试,可以很清楚的知道,一个进程有2801个子进程! 2〉 示例:使用系统调用getpid(),获得进程标识符 《一》在linux中打开vi编辑器,新建一个c程序,名字叫做7.2。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出! 《二》。然后在提示符$后输入命令:gcc –g 7.2.c –o 7.2对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.2对程序进行编译执行! 《三》通过测试,可以很清楚的知道,现在正在运行的进程的ID是2813! 3〉 示例:fork()创建子进程后,子进程在屏幕上显示子进程标识符与父进程标识符。 《一》在linux中打开vi编辑器,新建一个c程序,名字叫做7.3。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出! 《二》。然后在提示符$后输入命令:gcc –g 7.3.c –o 7.3对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.3对程序进行编译执行! 《三》通过测试,可以很清楚的知道,现在正在运行的进程的ID是2834!父进程2863个! 4〉使用execl()系统调用,运行目录列表程序ls。 《一》在linux中打开vi编辑器,新建一个c程序,名字叫做7.4。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出! 《二》。然后在提示符$后输入命令:gcc –g 7.4.c –o 7.4对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.4对程序进行编译执行! 《三》通过测试,可以很清楚的知道,该程序实际上是实现了”ls –l ”的命令! 5〉功能改用execv()系统调用完成。 《一》在linux中打开vi编辑器,新建一个c程序,名字叫做7.5。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出! 《二》。然后在提示符$后输入命令:gcc –g 7.5.c –o 7.5对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.5对程序进行编译执行! 《三》通过测试,可以很清楚的知道,该程序实际上是实现了”ls –l ”的命令! 6〉使用系统调用fork()与exec,使父子进程运行完全不同的程序。 《一》在linux中打开vi编辑器,新建一个c程序,名字叫做7.6。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出! 《二》。然后在提示符$后输入命令:gcc –g 7.6.c –o 7.6对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.6对程序进行编译执行! 《三》通过测试,可以很清楚的知道,该程序实际上是实现了”ls –l ”的命令! 7〉使用系统调用exit(),终止进程。 《一》在linux中打开vi编辑器,新建一个c程序,名字叫做7.7。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出! 《二》。然后在提示符$后输入命令:gcc –g 7.7.c –o 7.7对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.7对程序进行编译执行! 《三》通过测试,可以很清楚的知道,该程序实现了把进程为18188的程序退出的命令! 8>使用wait()系统调用,实现父子进程的简单同步。 《一》在linux中打开vi编辑器,新建一个c程序,名字叫做7.8。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出! 《二》。然后在提示符$后输入命令:gcc –g 7.8.c –o 7.8对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.8对程序进行编译执行! 《三》。在等待了大约十秒钟之后,会弹出如下的结果图~ 《四》。通过测试,我很清楚的知道,该程序实际上是实现了进程等待的命令~ 9>系统调用sleep() 《一》在linux中打开vi编辑器,新建一个c程序,名字叫做7.9。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出! 《二》。然后在提示符$后输入命令:gcc –g 7.9.c –o 7.9对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.9对程序进行编译执行! 《三》。在等待了大约一分钟之后,会弹出如下的结果图~ 四》。通过测试,我很清楚的知道,该程序实际上是实现了子进程开始睡眠,而父进程等待的命令~也就是所谓的程序的挂起! 2、Linux进程通信 调试上面7.2 Linux进程通信的各程序代码。 事例:在父子进程间建立管道,且子进程向父进程输送信息。 《一》在linux中打开vi编辑器,新建一个c程序,名字叫做7.10。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出! 《二》。然后在提示符$后输入命令:gcc –g 7.9.c –o 7.9对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.9对程序进行编译执行! 并完成并发程序设计的实验内容: 并发程序的设计关键是使用创建进程的系统调用,使一个程序运行时可以生成几个同时运行的程序,如果程序中没有创建进程的动作则为顺序程序设计。 本实验中的并发程序例子完成两个程序child和father之间的数据传递工作,具体做法分为四步。 步骤1:编制并发程序pipeline.c。 单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为pipeline.c。 在该程序中定义管道和文件描述符,并且创建子进程child。该程序用到的系统调用有pipe() 、dup() 、fork() 、close、execl() 、exit,它们的功能分别是建立管道、复制文件描述符、创建进程并使子进程与父进程有相同的程序正文、关闭文件描述符、用指定文件覆盖调用程序、撤销当前进程。 清单4-5 pipeline.c // 定义管道程序 # define STD_INPUT 0 // 定义标准输入设备描述符 # define STD_OUTPUT 1 // 定义标准输出设备描述符 int fd[2]; main() { static char process1[]=\"father\ pipe(fd); // 定义管道 pipeline(process1,process2); // 调用自定义函数pipeline() exit(1); // 程序结束 } pipeline(char* process1,char* process2) { int i; while ((i=fork())==-1); // 创建进程,直到创建成功为止 if (i) { close(fd[0]); // 关闭管道输入描述符 close(STD_OUTPUT); // 关闭标准输出描述符1 dup(fd[1]); // 指定标准输出描述符1为管道写指针 close(fd[1]); // 关闭原始管道写指针 execl(process1, process1, 0); // 用程序father覆盖当前程序 printf(\" father failed.\\n\"); // execl()执行失败 } else { close(fd[1]); // 关闭管道输出描述符 close(STD_INPUT); // 关闭标准输入描述符0 dup(fd[0]); // 指定标准输入描述符0为管道读指针 close(fd[0]); // 关闭原始管道读指针 execl(process2,process2,0); // 用程序child覆盖当前程序 printf(\"child failed.\\n\"); // execl()执行失败 } exit(2); // 程序结束 } 步骤2:编制“管道写”程序father.c作为父进程的一部分工作。其内容如下: 单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为father.c。 清单4-6 father.c main() { static char string[] = “Parent is using pipe write.” ; int len; len = sizeof(string) ; write(l, string, len) ; /* 将string中的内容写入管道中 */ printf(“parent, parent, parent \\n \\n \\n” ) ; exit(0) ; } 步骤3:编制“管道读”程序child.c作为子进程的一部分工作。其内容如下: 单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为child.c。 清单4-7 child.c main() { char output[30] ; read (0, output, 30) ; /* 从管道中读数据并存入output中 */ printf(“%s \\n child, child. \\n” , output) ; return(0) ; } 步骤4:编译。 cc –o child child.c cc -o father father.c cc -o pipeline pipeline.c 步骤5:运行。 ./pipeline 首先单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中分别键入三个程序。三个程序的程序名分别为pipeline.c,father.c和child.c。 若运行不成功,则应该用文本编辑器对源程序进行修改调试。 运行显示结果为: _______________________________________________________________ _____3、Linux命令接口管理进程 步骤1:登录进入GNOME。 在Linux登录框中填写指导老师分配的用户名和口令,登录Linux系统。 步骤2:访问命令行。 单击红帽子,在“GNOME帮助”菜单中单击“系统工具”-“终端”命令,打开“终端”窗口。 步骤3:回顾系统进程概念。 每个运行的程序都会创建一个进程,进程分配到一个唯一的进程标识符 (PID) 。PID被系统用于标识和跟踪进程,直到进程结束。操作系统内核管理所有进程的初始化和终止。每一个进程都要求系统资源 (例如CPU时间和RAM空间) 在其中工作。当进程启动的时候,操作系统把系统资源分配给每个进程,当进程终止的时候,系统回收这些资源。在Linux系统启动的时候,首先启动的两个进程是sched (调度) 和init (初始化) ,它们管理着其他进程。Linux系统中有几种不同类型的进程: 守护进程:由Linux内核启动的进程,为了特定目的而存在。例如,lpsched守护进程存在只是为了处理打印作业。 父进程:派生其他进程的进程是父进程。一个叫做init的守护进程是第一个调用的进程。每一个进程,除了init之外,都有一个父进程。 子进程:由其他进程派生出来的进程叫做子进程。 孤儿进程:在进程返回输出之前,它的父进程结束了,这样的进程叫做孤儿进程。 僵进程:子进程没有带着输出返回给父进程。这样的进程在系统中变成丢失的进程。 使用此前的信息,完成以下填空: 1) Linux系统中,几乎每一个启动的进程,都会由内核分配一个唯一的____进程标识符(PID)____,用于跟踪从进程启动到进程结束。 2) 当启动新进程的时候,内核也给它们分配系统资源,如___内存____和__资源______。 3) 永远不向父进程返回输出的进程叫做_____僵进程_________。 4) 由父进程派生出来的进程叫做________子__________进程。 5) _______父_________进程是一个派生另一个进程的进程。 6) 运行用于提供服务的Linux系统进程是____ 守护进程__________。 7) 如果父进程在子进程之前结束,它创建了一个_____孤儿_________进程。 步骤4:回顾ps命令和信息。 ps命令用于列出当前系统中运行的进程。 如果一个进程耗时太长,或者看上去好像已经终止了,表现为一个终端窗口不再响应或挂起,通常需要使用ps查看系统中的进程。通过列出进程,可以查看初始化进程的命令或程序的名字,以及所有它派生出来的子进程。通过多次执行ps命令,查看进程的时间——进程占用的CPU时间,可以检查一个进程是否还在运行。如果时间小再增长,那么进程可能已经终止了。如果进程占用太长的时间或者已经停止,可以使用ps命令检查进程的进程ID (PID) ,然后杀死进程。 ps命令的输出将显示PID号和与其相关的命令或程序。PID号通常用于终止一个进程。ps命令 ( ps [-options] ) 的3个主要选项如下表所示。 表3-5 ps命令选项 ps选项 意义 功能 显示当前shell或终端窗口中,当前用户的进Ps 无选项 程信息 ps –e 每一个 显示系统中每一个进程的信息 产生一个完全列表,给出每个进程的所有可ps –f 完全 用信息 ps userid -u 用户 显示特定用户的所有进程 基本的ps命令显示在当前shell中的进程信息,用户只能够查看在这个终端窗口中初始化的进程。输入ps命令,将结果填入表3-6中。 表3-6 实验记录 PID TTY TIME CMD ?2367 ?pts/0 ?00:00:00 Bash? ?3001 ?pts/0 ?00:00:00 ?ps 从当前终端窗口中,练习使用给出的每个选项的ps命令。 输入 ps -f 命令,显示运行在系统中的某个进程的完全信息,填入表3-7中。 表3-7 实验记录 UID PID PPID C STIME TTY TIME CMD ?root ?2937 ?2935 0? ?18:15 pts/0? ?00:00:00 bash? ?root ?3003 2937? ?0 18:34? pts/0? ??00:00:00 ?ps -f ps -f命令输出的各栏标题见表3-8所示。 表3-8 ps -f栏标题 值 描述 UID 初始化进程的用户ID PID 进程的进程标识号。PID可以用来杀死进程 PPID 进程的父进程标识号 C 进程的优先级 STIME 进程的启动时间 TTY 控制进程终端的终端举型 TIME 进程使用的CPU时间的数量 CMD 命令名守护进程 (执行的程序的名字) 步骤5:列出系统中运行的所有进程。 输入 ps -ef 命令,显示运行在系统中的各个进程的完全信息。执行该命令,并与ps –f命令的输出结果对照,一致吗?有何不同? _______不一致!用户类型增加了!________________________________________ 注意分析当前终端窗口中的输出结果: a. 显示了多少个进程? _____________64______________________________________________________ b. 进程ID的PID是什么? ____________进程的进程标识号。PID可以用来杀死进程 _________________________ c. 启动进程的命令 (CMD) 是什么? ________________sched ___________________ d. 请观察,什么命令的PID号是1? ___________intit ________________________________________________________ e. 再次运行ps –ef命令,计算进程的数目: ____________________________________________________________________ 然后执行下列命令把输出结果输入到wc命令中: ps -ef | wc -l 第一个数字显示的是行的数目,也是进程的数目: _________________64___________________________________________________ 执行 man ps命令,可以打开Linux用户命令手册,了解ps命令的用法,输入wq命令可退出用户手册的阅读。man命令可以执行吗?结果如何? ___________不可以__________________________________ 步骤6:根据命令名搜索特定的进程。 为了终止一个进程,必须找到该进程的PID。大多数运行的系统中,有上百个进程在运行,ps -ef的列表可能很长。如果知道启动进程的执行程序的名字,可以更快地找到PID。 通过把ps命令的输出结果输入到grep中,可以搜索想要终止的特定进程,确定正确的PID。 grep命令可以在其他命令的输出中搜索所有类型的特征字符串。-l (长的输出) 选项将显示和找到的PID相关的进程的名字;-e选项显示PID和初始化命令的名字。 a. 单击红帽子,在“GNOME帮助”菜单中单击“游戏”-“堆麻将”命令,打开“堆麻将”游戏。 b. 在当前的终端窗口中,执行命令: ps –e | grep mahjongg (“堆麻将”游戏的进程名是“mahjongg”) ,查找和“堆麻将”游戏调度守护进程相关的所有进程。 c. 显示了多少个相关进程? _____________________2_______________________________________________ d. 显示进程中最小的进程ID号是多少? _______________2818_____________________________________________________ c. 在当前终端窗口中执行命令: pgrep –l mahjongg 查找所有和“堆麻将”游戏调度守护进程相关的进程。ps和pgrep命令输出之间有什么不同? ps –e | grep mahjongg命令比pgrep –l mahjongg命令输出结果多显示了TTY和TIME ___________________________ 步骤7:确定一个要终止的进程。 当试图终止一个程序,或者释放一个挂起的终端窗口的时候,杀死和不响应的应用相关的PID可能还是不够的,一般需要杀死那个进程的父进程,在少数情况下,甚至要杀死父进程的父进程。为了沿着层次结构,从子进程追溯到派生它们的父进程,必须能够查找PID和PPID。 必须首先确定最低级不响应进程的PID。通常,可以试着去杀死那个进程。如果这样做不能够停止那个进程,可能需要杀死它的父进程。杀死父进程将杀死所有它派生的子进程。杀死一个父进程也比杀死几个子进程快得多。 1) 在GNOME当前终端窗口中,输入ps命令。 有多少进程正在运行?为什么只有这么少的进程? ____有2个进程正在运行。因为单前只运行bash和ps这两个程序______ 2) 正在运行的进程的名字是什么?它表示什么? __bash和ps。bash是打开终端后自动启动的程序,ps是当前执行的命令。_______ 3) 这个进程的PID是多少? _____________2836和2868___________________________________ 4) 在bash shell中输入命令csh,打开一个C shell会话,当前系统的会话提示符是什么? ______________________~______________________________________________ 5) 输入 ps -f 命令,显示在当前shell中运行的进程的所有信息。现在什么进程正在运行? ________________bash,-sh和ps -f________________ 6) bash的PID是-sh (csh) 的PPID吗? _____________________________是_______________________________________ 7) 输入命令sleep l000&,创建一个进程,把执行挂起1000秒 (大约15分钟) 。&表示在后台运行命令,返回shell提示符,这样您可以继续工作。 8) 再次输入ps -f命令。-sh (csh) 的PID是sleep命令的PPID吗?哪个PID是csh (C shell) 的子进程? ________是,sleep 1000 和 ps -f 都是csh (C shell) 的子进程___________ 9) 输入命令 kill -9 退出C shell。然后再次键入ps -f命令。什么PID是sleep父命令的PPID? ________________________0____________________________________________ sleep进程现在是什么类型的进程? _____________孤儿进程_____________________________________________ 步骤8:使用kill命令终止一个进程。 信号用于终止、挂起和继续进程。有时候使用Ctrl + c可以终止一个不响应的进程。这样向进程发送一个中断 (INT) 信号,终止它及所有它派生的子进程。 kill命令提供了一个终止不想要的命令进程的直接方法。当想停止一个运行了很长时间的命令的时候,或者当需要终止一个不能够正常退出的进程的时候,它很有用。指定PID正常地杀死一个进程。 kill [-signal] process -id 为了使用kill命令终止一个进程,应该首先键入ps找出进程的PID,然后键入kill紧跟着PID。如果使用kill而没有指定信号,则信号15 (SIGTERM) 将被发送给特定PID号的进程。这叫做软杀死,通常终止了进程。如果可能,最好软杀死进程,这样它可以正确地关闭文件,温和地终止进程。 如果需要强制终止一个进程,可以使用带 -9选项的kill命令。这个选项叫做强制杀死,当shell对所有其他终止信号都不响应的时候,需要使用它来杀死shell。 kill -9 process -id 注意:对于shell之外的进程,把kill –9 (SIGKILL) 作为最后的选项,因为它是一种生硬的方法,不允许正确的进程终止。 a. 输入命令ps –f ,显示在当前shell中运行的进程的完整信息。现在什么进程正在运行? _______bash和ps -f_____________________________________________________ b. 因为sleep进程现在是一个孤儿进程,已经被init进程 (PID #l) 收养,输入命令,对sleep的PID执行软杀死。如果sleep已经终止 (超过15分钟) ,则重复步骤7中的8) 、9) 操作,然后软杀死sleep程序。再次输入ps -f命令。现在什么进程正在运行? _____________ bash和ps -f_____________________________________________ 步骤9:按照用户查找和终止一个进程。 ps命令可以带 -u (用户) 选项使用,查找指定用户的进程。这个命令比ps-ef使用得更多,因为一般只能够管理属于自己的进程。我们可以通过用户登录名或者UID号来查找用户的进程。用户只能够终止自己的进程,但是超级用户可以终止系统中所有运行的进程。 ps –u login-ID或UID 1) 启动计算器和“堆麻将”游戏GNOME应用程序。 2) 使用带 -u选项的ps命令,查找以登录ID (例如,userX) 或者数字UID (例如,1004) 运行的所有进程。计算器应用程序的PID是什么? ____________________3015________________________________________________ 3) 使用软杀死终止计算器应用程序,“堆麻将”是否仍然在桌面上运行? __________________是__________________________________________________ 4) 使用ps -u命令组合grep,查找“堆麻将”程序的PID号,而不是使用ps -u查找整个列表。您使用什么命令? 提示:猜猜“堆麻将”程序的命令名中可能有哪个字母,使用grep搜索那些字母。 ___________ ps –u |grep mahjongg_________________________________ 5) 终止“堆麻将”程序。它是否还在桌面上运行? ____________________否________________________________________________ 6) 退出 C shell。 步骤10:删除所有在本实验中创建的文件和目录。 4、Linux命令接口的重定向与管道 1. 使用重定向标准输出符号 步骤3:重定向标准输出,创建一个文件。 右尖括号或称大于符号 (>) 把命令的输出发送到一个文件中:使用单个右尖括号,当指定文件名不存在的时候,将创建一个新文件;如果文件名存在,它将被覆盖。(注意:命令、重定向符号和文件名之间的空格是可选的) 。 重定向标准输出命令的格式是: command > file 1) 为核实当前所在目录位置,使用什么命令? __________________pwd__________________________________________________ 如果当前位置不在主目录中,使用什么命令可以改变到主目录中? _________________cd /___________________________________________________ 2) 如果希望把文件和目录列表截获,存储为主目录中的一个文件,这样可以追踪主目录中有什么文件。使用什么命令,把长文件列表的输出重定向,创建一个叫做homedir.list的文件。 __________________ls >homedir.list____________________________________ 3) 新文件homedir.list被放在哪里? __________________根目录__________________________________________________ 使用ls命令核实新文件存在。 4) 使用什么命令,以一次一屏的方式,来查看刚才创建的文件内容? ______________ls –l|more homedir.list______________________________ 5) 使用head命令截获homedir.list文件的前10行,通过重定向,创建一个叫做dhomedir.list-top-10的新文件。应该使用什么命令? ___________head -10 homedir.list >dhomedir.list-top-10____________________ 使用more命令查看文件的内容。 __________________ls -l |more dhomedir.list-top-10___________________________ 6) 使用tail命令,截获homedir.list文件的最后10行,通过重定向,创建一个叫做dhomedir.list-top-10的新文件。使用什么命令? _____________________tail -10 homedir.list>dhomedir.list-top-10________________ 使用more命令查看文件的内容。 _______________________ls dhomedir.list-top-10__________________________ –l |more 7) 截获cal -y命令的输出,把它存到名为calendar的文件中。查看文件的内容。截获了什么? _________cal –y >calendar |more calendar_______________________________ 8) 截获cal 2010命令的输出,把它存到名为calendar的文件中。查看文件的内容。其中有什么内容? _____cal –y 2010 >calendar |more calendar_______2010年12个月的日历__________ 日历有什么变化? __________不是2014年,变成了2010年的了__________________ 步骤4:防止使用重定向的时候覆盖文件。 在bash shell中,一个叫做noclobber的选项可以用来设定防止在重定向的过程中覆盖文件。可以在命令行中使用$set -o noclobber命令来完成。o代表选项。 为了重新激活clobber特性,使用$set -o noclobber;撤消则用set +o noclobber。 如果你使用的是csh shell,为了激活/撤消C shell中的clobber特性,使用set noclobber和unset noclobber。 1) 输入命令,打开shell中的noclobber选项。输入什么命令? _____________set –o noclobber________________________________________ 2) 输入命令ls -l > homedir.list,结果是什么? ________ bash:homedir.list:cannot overwrite existing file.因为clobber选项防止了 重定向过程覆盖文件____________________________________________________________ 3) 输入命令ls -l > homedir.list2,结果是什么? ______________不能重定向___________________________ 步骤5:向现有的文件追加输出。 如果想向一个现有的文件追加 (添加到末尾) 文本而不是覆盖它,可以使用双右尖括号 (>>) 。这个选项当文件不存在的时候,会创建一个新文件,或者追加到已有文件。 追加命令的格式是: command >> file 1) 输入命令,显示“Happy Bday”一行字,使用重定向符号截获输出,把它存到叫做bday4me的文件中。使用什么命令? ______________ echo “Happy Bday” >>bday4me________________________________ 2) 输入命令,显示“YOURNAME!”一行字,使用双重定向符号,把输出追加到bday4me文件中。查看bday4me文件的内容。其中有什么? _______________ echo “YOURNAME” >>bday4me_______________________________ 3) 输入命令,显示您出生年月的日历 (如果在1985年的6月出生,输入cal 6 1985) ,使用双重定向符号,把输出追加到bday4me文件中。使用什么命令? ____________ cal 06 1985 >>bday4me__________________________ 4) 查看bday4me文件的内容。注意这3个命令的输出在bday4me文件中已经被组合起来了。您是在一周中的哪一天出生的? ______________________周一_____________________________________________ 2. 使用管道符号 步骤6:把命令的输出导入到另一个命令中。 1) 使用管道元字符,发送ls -l命令的输出,作为more命令的输入 (注意:如果在当前目录中没有太多的文件,使用 /etc目录获取长列表) 。把输出作为more命令的输入的时候,得到什么结果? _____输入命令ls –l |more 结果以一屏一次的方式显示在屏幕上 ________ 2) 查看使用ls –l | more命令列出来的文件,注意创建或修改的日期。为了查看在同一个月被创建或修改的文件或目录的列表,可以使用grep命令对那个月进行搜索。当月份显示在列表中的时候,指定它 (例如:Oct) 。输入命令ls -1 | grep Oct (或者想查找的月份) 。结果是什么? ___________只显示10月的目录____________________________________ 3) 目录总是4096字节大小。输入命令ls -1 | grep 4096。产生的列表是什么 __________ 4096字节大小的目录显示 ________________________________________________________________________ 4) 可以使用多个管道连接多个命令。输入取得长文件列表输出的命令,把它输入给tail命令,然后到sort命令。输入的命令是: _______________ ls –l|tail|sort_______________________ 5) ps (进程状态) 命令用于查看Linux系统中运行什么进程。把ps -e命令的输出输入给more命令。-e选项将给出每一个在系统中运行的进程。把输出输入到more命令中的结果是什么? _______输入命令_ps –e|more____显示所有系统中运行的程序___________________ 步骤7:删除在本实验中创建的文件和目录。 步骤8:关闭终端窗口,注销。 可选练习 1. 使用set -o命令不指定任何选项,可以查看noclobber特性是否已经打开。 1) 输入set -o。noclobber特性打开还是关闭的?如果它是关闭的,打开它。使用什么命令? ____________关闭set –o noclobber____________________________ 2) 永久的关闭noclobber特性。使用什么命令? ____________________ set +o noclobber____________________________ 2. 可以把管道和重定向组合起来使用,达到特殊的效果。输入命令创建一个名为top5.list的文件,内容为主目录中的头5行记录,使用什么命令? __________ ls –l|head –5 >top5.list___________________________ 二、实习总结 通过本章节的学习,我懂得了进程的创建fork(),等待 wait(),休眠 sleep(),终止exit()等!其中fork()实现的是当前的进程变成父进程,而新建的进程则为上一个进程的子进程!wait()可以实现父进程和子进程同时进行的功能!sleep()可以实现一个进程等待另一个进程的作用!exit()则是进程的终止,让进程退出,不再执行! 通过本章节的学习,还学到了关于管道通信相关的知识!父子进程建立管道,子进程向父进程写入传递信息。并发程序的设计关键是使用创建进程的系统调用,使一个程序运行时可以生成几个同时运行的程序,如果程序中没有创建进程的动作则为顺序程序设计。并发程序完成子进程和父进程之间的数据传递工作。 通过本章节的学习,对于linux命令接口管理进程,有了一定的认知!每个运行的程序都会创建一个进程,进程分配到一个唯一的进程标识符 (PID) 。PID被系统用于标识和跟踪进程,直到进程结束。操作系统内核管理所有进程的初始化和终止。每一个进程都要求系统资源 (例如CPU时间和RAM空间) 在其中工作。当进程启动的时候,操作系统把系统资源分配给每个进程,当进程终止的时候,系统回收这些资源。在Linux系统启动的时候,首先启动的两个进程是sched (调度) 和init (初始化) ,它们管理着其他进程。Linux系统中有几种不同类型的进程: 守护进程:由Linux内核启动的进程,为了特定目的而存在。例如,lpsched守护进程存在只是为了处理打印作业。 父进程:派生其他进程的进程是父进程。一个叫做init的守护进程是第一个调用的进程。每一个进程,除了init之外,都有一个父进程。 子进程:由其他进程派生出来的进程叫做子进程。 孤儿进程:在进程返回输出之前,它的父进程结束了,这样的进程叫做孤儿进程。 僵进程:子进程没有带着输出返回给父进程。这样的进程在系统中变成丢失的进程。 ps命令的输出将显示PID号和与其相关的命令或程序。以及一些ps命令的使用! 通过本章节的学习和实践,我还学会了使用linux接口命令的重定向。在linux中重定向,主要使用到的是>和>>符号! 右尖括号或称大于符号 (>) 把命令的输出发送到一个文件中:使用单个右尖括号,当指定文件名不存在的时候,将创建一个新文件;如果文件名存在,它将被覆盖。 如果想向一个现有的文件追加 (添加到末尾) 文本而不是覆盖它,可以使用双右尖括号 (>>) 。这个选项当文件不存在的时候,会创建一个新文件,或者追加到已有文件。 命令的输出导入到另一个命令!也就是多个命令的结合使用!比较常用的有:ls -l|more 文件名,ls -l|grep 文件大小,ls -l |grep 月份,ps -e|more等等。

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