实验一UNIX/LINUIX入门实验学时:2学时实验类型:验证型一、实验目的了解UNIX/LINUX运行环境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX下c语言程序的编写、编译、调试和运行方法。二、实验内容熟悉UNIX/LINUX的常用基本命令如ls、who、pwd、ps等。练习UNIX/LINUX的文本行编辑器vi的使用方法熟悉UNIX/LINUX下c语言编译器cc/gcc的使用方法。用vi编写一个简单的显示“Hello,World!”c语言程序,用gcc编译并观察编译后的结果,然后运行它。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、Linux常用命令Linux系统常用命令格式:command[option][argument1][argument2]...其中option以“-”开始,多个option可用一个“-”连起来,如“ls-l-a”与“ls-la”的效果是一样的。根据命令的不同,参数分为可选的或必须的;所有的命令从标准输入接受输入,输出结果显示在标准输出,而错误信息则显示在标准错误输出设备。可使用重定向功能对这些设备进行重定向。命令在正常执行结果后返回一个0值,如果命令出错可未完全完成,则返回一个非零值(在shell中可用变量$?查看)。在shellscript中可用此返回值作为控制逻辑的一部分。帮助命令:man获取相关命令的帮助信息例如:mandir可以获取关于dir的使用信息。info获取相关命令的详细使用方法例如:infoinfo可以获取如何使用info的详细信息。bzip2/bunzip2.bz2文件的压缩/解压缩程序cpio备份文件dump备份文件系统gzip/gunzip.gz文件的压缩/解压缩程序gzexe压缩可执行文件restore还原由倾倒(Dump)操作所备份下来的文件或整个文件系统(一个分区)tar将若干文件存档或读取存档文件unarj解压缩.arj文件zip/unzip压缩/解压缩zip文件磁盘操作:cd/pwd切换目录/显示当前工作目录df显示磁盘的相关信息du显示目录或文件的大小e2fsck检查ext2/ext3文件系统的正确性fdisk对硬盘进行分区fsck检查文件系统并尝试修复错误losetup设置循环设备ls列出目录内容mkdir创建目录mformat对MS-DOS文件系统的磁盘进行格式化mkbootdisk建立目前系统的启动盘mke2fs建立ext2文件系统mkisofs制作iso光盘映像文件mount/umount加载文件系统/卸载文件系统quota显示磁盘已使用的空间与限制sync将内存缓冲区内的数据写入磁盘tree以树状图列出目录的内容系统操作:alias设置指令的别名chkconfig检查,设置系统的各种服务clock调整RTC时间date显示或设置系统时间与日期dmesg显示开机信息eval重新运算求出参数的内容exit退出目前的shellexport设置或显示环境变量finger查找并显示用户信息free显示内存状态hostid显示主机标识hostname显示主机名id显示用户标识kill删除执行中的程序或工作last列出目前与过去登入系统的用户相关信息logout退出系统lsmod显示已载入系统的模块modprobe自动处理可载入模块passwd设置用户密码psprocessstatus报告程序状况reboot重启计算机rhwo查看系统用户rlogin远程登入rpm管理Linux各项套件的程序shutdown关机suswitchuser变更用户身份top显示,管理执行中的程序uname显示系统信息useradd/userdel添加用户/删除用户userinfo图形界面的修改工具usermod修改用户属性,包括用户的shell类型,用户组等,甚至还能改登录名w显示目前注册的用户及用户正运行的命令whereis确定一个命令的二进制执行码,源码及帮助所在的位置who列出正在使用系统的用户whois查找并显示用户信息网络通信:arp网地址的显示及控制ftp文件传输lftp文件传输mail发送/接收电子邮件mesg允许或拒绝其他用户向自己所用的终端发送信息muttE-mail管理程序ncftp文件传输netstat显示网络连接、路由表和网络接口信息pine收发电子邮件,浏览新闻组ping向网络上的主机发送icmpechorequest包ssh安全模式下的远程登录telnet远程登录talk与另一用户对话traceroute显示到达某一主机所经由的路径及所使用的时间wget从网络上自动下载文件write向其他用户的终端写信息文件操作:cat显示文件内容和合并多个文件clear清屏chattr改变文件属性chgrp改变文件组权chmod改变文件或目录的权限chown改变文件的属权comm比较两个已排过序的文件cp将文件拷贝至另一文件dd从指定文件读取数据写到指定文件df报告磁盘空间使用情况diff比较两个文本文件,列出行不同之处du统计目录/文件所占磁盘空间的大小file辨识文件类型emacs功能强大的编辑环境find搜索文件并执行指定操作(find2)grep按给定模式搜索文件内容head显示指定文件的前若干行less按页显示文件ln创建文件链接locate查找符合条件的文件more在终端屏幕按帧显示文本文件mv文件或目录的移动或更名rm/rmdir删除文件/目录sed利用script来处理文本文件sort对指定文件按行进行排序tail显示指定文件的最后部分touch创建文件tr转换字符vi全屏编辑器wc显示指定文件中的行数,词数或字符数which在环境变量$PATH设置的目录里查找符合条件的文件mv文件或目录的移动或更名rm/rmdir删除文件/目录sed利用script来处理文本文件sort对指定文件按行进行排序tail显示指定文件的最后部分touch创建文件tr转换字符vi全屏编辑器wc显示指定文件中的行数,词数或字符数实验二进程管理实验学时:2学时实验类型:验证型、设计型一、实验目的加深对进程概念的理解,明确进程与程序的区别;进一步认识并发执行的实质。二、实验内容(1)进程创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“a“;子进程分别显示字符”b“和字符“c”。试观察记录屏幕上的显示结果,并分析原因。(2)进程控制修改已编写的程序,将每一个进程输出一个字符改为每一个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。(3)进程的管道通信编写程序实现进程的管道通信。使用系统调用pipe()建立一个管道,二个子进程P1和P2分别向管道各写一句话:Child1issendingamessage!Child2issendingamessage!父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,再接收P2)。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验报告要求实验目的实验内容实验要求实验设计(功能设计、数据结构、程序框图)实验结果及分析运行结果感想参考资料五、补充材料管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者用于运行于同一台机器上的任意两个进程间的通信。无名管道由pipe()函数创建:#includeunistd.hintpipe(intfiledis[2]);参数filedis返回两个文件描述符:filedes[0]为读而打开,filedes[1]为写而打开。filedes[1]的输出是filedes[0]的输入。下面的例子示范了如何在父进程和子进程间实现通信。#defineINPUT0#defineOUTPUT1voidmain(){intfile_descriptors[2];/*定义子进程号*/pid_tpid;charbuf[256];intreturned_count;a/*创建无名管道*/pipe(file_descriptors);/*创建子进程*/if((pid=fork())==-1){printf(Errorinfork\n);exit(1);}/*执行子进程*/if(pid==0){printf(inthespawned(child)process...\n);/*子进程向父进程写数据,关闭管道的读端*/close(file_descriptors[INPUT]);write(file_descriptors[OUTPUT],testdata,strlen(testdata));exit(0);}else{/*执行父进程*/printf(inthespawning(parent)process...\n);/*父进程从管道读取子进程写的数据,关闭管道的写端*/close(file_descriptors[OUTPUT]);returned_count=read(file_descriptors[INPUT],buf,sizeof(buf));printf(%dbytesofdatareceivedfromspawnedprocess:%s\n,returned_count,buf);}}实验三一个进程启动另一个程序的执行实验学时:2学时实验类型:设计一、实验目的编写Linux环境下,fork()与exec()的结合使用实现一个进程启动另一个程序的执行的基本方法,掌握exec()的几种调用方法。二、实验内容父进程从终端读取要执行的命令,并交给子进程执行。父进程等待子进程结束,并打印子进程的返回值。提示:从终端读取要执行的命令可用fgets()实现。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验报告要求实验目的实验内容实验要求实验设计(功能设计、数据结构、程序框图)实验结果及分析运行结果感想参考资料五、补充材料一个进程如何来启动另一个程序的执行?在Linux中要使用exec()类的函数实现在一个进程来启动另一个程序。exec类的函数不止一个,但大致相同,在Linux中,它们分别是:execl,execlp,execle,execv,execve和execvp,下面以execlp为例,其它函数究竟与execlp有何区别,请通过manexec命令来了解它们的具体情况。一个进程一旦调用exec类函数,它本身就“死亡”了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,唯一留下的,就是进程号,也就是说,对系统而言,还是同一个进程,不过已经是另一个程序了。如果你的程序想启动另一程序的执行但自己仍想继续运行的话,怎么办呢?那就是结合fork与exec()的使用。下面一段代码显示如何启动运行其它程序:#includestdio.hcharcommand[256];intmain(){intrtn;/*子进程的返回数值*/interrorno;while(1){/*从终端读取要执行的命令*/printf();fgets(command,256,stdin);command[strlen(command)-1]=0;if(fork()==0){/*子进程执行此命令*/errorno=execlp(command,command,NULL,NULL);/*如果exec函数返回,表明没有正常执行命令,打印错误信息*/perror(command);exit(errorno);}else{/*父进程,等待子进程结束,并打印子进程的返回值*/wait(&rtn);printf(childprocessreturn%d\n,rtn);}}return0;}表1exec(