Linux程序设计-技术技巧与项目实践-第10章.ppt

上传人:za****8 文档编号:15800661 上传时间:2020-09-07 格式:PPT 页数:94 大小:2.12MB
返回 下载 相关 举报
Linux程序设计-技术技巧与项目实践-第10章.ppt_第1页
第1页 / 共94页
Linux程序设计-技术技巧与项目实践-第10章.ppt_第2页
第2页 / 共94页
Linux程序设计-技术技巧与项目实践-第10章.ppt_第3页
第3页 / 共94页
点击查看更多>>
资源描述
2020/9/7,1,第十章 Linux程序设计实践项目,实践项目一 虚拟机环境下的LINUX安装 实践项目二 LINUX的系统管理与基本命 实践项目三 VI编辑器练习 实践项目四 SHELL程序设计 实践项目五 C程序设计与多文件编译 实践项目六 内存动态分区管理 实践项目七 LINUX文件操作编程 实践项目八 系统调用与设备管理,2020/9/7,2,10.1 实践项目一 虚拟机环境下的Linux安装,10.1.1 实践目的 1. 掌握linux系列操作系统的安装过程。 2. 掌握启动、关闭和管理操作系统的基本方法。 3. 学会安装其他软件的方法。 10.1.2 实践准备 Red Hat Linux操作系统既可以单独安装在一个计算机系统中,也可以与Windows等操作系统共同安装在一个计算机硬件系统中,但注意安装顺序,要求最后安装linux系统。 关于操作系统的安装要了解一些基本知识,概括起来就是如下的内容: 1.硬盘分区。一个硬盘可以分割成不同的分区,每个分区作为一个逻辑硬盘使用。每个分区都有一个类型,表示这个分区中的信息是如何存储的。为安装Red Hat Linux,常推荐的分区配置:根分区、交换分区、/usr分区、/home分区。还可以根据不同使用环境创建/usr/local分区、/usr/src分区、/var分区和/boot分区等。 2.安装类型。Red Hat Linux提供了3种类型的安装:客户机类型(Workstation)、服务器类型安装(Server System)和自定义类型的安装(Custom System)。,2020/9/7,3,10.1.3 实践内容 首先熟悉从光盘安装Red Hat Linux的基本过程。这个过程包括一下的步骤: 从光盘或文件启动安装程序、是否检测CD介质、语言选择、键盘配置、安装方式选择、鼠标配置、升级还是安装、为Red Hat Linux创建分区(通常选默认分区)、制作启动软盘、时区选择、root账户配置、选择安装包、结束安装。 关于安装linux或iso文件安装的具体过程和细节请参考本书第二章的相关内容或网络与其它教材中的相关内容。 这里安装的环境软件是Windows XP+VMware6.0+RHELinux AS 4。先准备好这些软件,可以通过网络、学校或单位的ftp站点去下载,也可以通过其它途径获得。这些软件目前已有最新的版本或linux的其它版本,读者可以自行试用,安装过程大同小异。如果出现了一些情况而无法继续安装,请利用关键词或短句通过网络或其它手段不断交流来解决问题。,2020/9/7,4,下面在VMware6.0上安装Red Hat Enterprise Linux AS 4解析安装过程。 1安装VMware6.0,根据提示进行安装和注册。 2运行VMware6.0,呈现如图10.1的界面。,2020/9/7,5,3点击“新建虚拟机”创建一个新的虚拟机,出现如图10.2的向导。 4点击“下一步”,进入图10.3,选择“典型”。如果选择“自定义”,可以有更多的选择,但比较复杂,建议熟练后再选择“自定义”安装项。这里建议第一次安装时选择“典型”选项。,2020/9/7,6,5. 选择linux客户机系统如图10.4,版本为Red Hat Enterprise Linux 4。,2020/9/7,7,6填写虚拟机名称,并且选择文件保存目录,如图10.5。,2020/9/7,8,7选择虚拟机使用的网络类型“使用桥接网络”,如图10.6。,2020/9/7,9,8制定磁盘容量,如图10.7。一般而言,默认的是8个G的空间安装linux,简化安装只需要3G的空间。点“完成”则会出现虚拟机创建成功的温馨提示。至此,就完成了虚拟机的创建过程。这里是中英文混合界面,实际上,也就几个单词而已,其它软件也一样,大不了翻翻词典就能完全明白,不翻词典也能猜出来。,2020/9/7,10,9按Ctrl+D进行虚拟机设置,如图10.8,设置内存为1G,虚拟处理器根据实际情况可设置为1个或2个,以太网选择桥接方式,其他默认。,2020/9/7,11,10为了避免在安装过程中要求换安装盘,在这里添加三个光驱硬件,分别对应需使用的各个ISO镜像文件,如图10.9所示。当然,只设一个安装盘也可以,在提示换盘时重新选择下一张盘的iso文件就可以了。点OK回到Vmware的软件界面。,2020/9/7,12,11按Ctrl+B或点工具栏上的绿三角图标,默认设置是光驱启动虚拟机,则进入到如图10.10的界面,直接按回车开始安装。如果按回车没有反应,请把鼠标在虚拟机的界面上点一下,再按回车就能够继续。,2020/9/7,13,12选择是否探测你的光盘正确性,这里因为采用iso文件安装,所以选择“Skip”。因为此时的鼠标不可见,只能用“”键来选择,然后回车。此时鼠标在虚拟机里,在windows里是无法使用的,怎么办呢?同时按下Ctrl和Alt键,就可以把鼠标从虚拟机里调出来使用。以后可以在菜单里点“安装虚拟机工具”或“Install VMware Tools”来激活鼠标,就无需在按组合键了。,2020/9/7,14,13系统进入图形安装界面,点“Next”。如果没有出现图10.11的欢迎界面,或者在字符界面的最后一行出现“you may safely reboot your system”的友好提示,可以从头再来,选择“自定义”并适当配置其中的选项,直到出现本届面为止才能正确安装。最好是重新下载第一张盘的iso文件或把该文件位置放在第一个磁盘。,2020/9/7,15,14点“Next”进入安装向导“语言选择”界面,选择“Chinese”,则向导就变为中文提示。 15点“Next” 进入“键盘配置”,默认选择就可以,点“下一步”。 16进入“磁盘分区设置”页,选择“用Disk Druid手工分区(D)”,并在弹出警告中选择“是” 17进入磁盘分区如图10.12所示。,2020/9/7,16,18进行简单分区,分别创建一个交换分区(内存大小的2倍)和根分区(剩余空间),如图10.13。,2020/9/7,17,19根据提示完成其它选项的设置,如图10.14所示。,2020/9/7,18,20在VMware Workstation中点链接“Start this virtual machine”就可以启动该linux系统,在其中进行linux的所有练习和在pc上直接安装linux的环境下相同,不同的地方就是网络设置有些区别。下面图10.15就是安装好的RHEL AS4启动后的登录界面。,2020/9/7,19,21下面图10.16是RHEL AS4登录成功后的主窗口,即桌面情况。,2020/9/7,20,22至此,安装过程就结束了。针对不同的linux版本,安装过程大同小异。多多练习,就会熟能生巧的。 实际上,不仅可以在VMware下安装linux,还可以安装几乎所有的操作系统,生成虚拟机。在虚拟机里,可以海阔凭鱼跃,天高任鸟飞。即使系统崩溃了,也不过使昙花一现而已,再装一次就可以从头再来。对宿主系统丝毫没有影响,唯一的影响就是在虚拟机运行时会占用宿主机的资源,导致一些程序运行速度减缓而已。 VMware为用户熟练掌握操作系统提供了广阔的空间,可以在其间多多练习,成为系统管理的行家里手,将来在学习与工作中可以一帆风顺,步步高升。宿主机的系统也可以多种多样,除了windows XP外,也可以是各种linux系统。,2020/9/7,21,10.2 实践项目二 Linux的系统管理与基本命令,10.2.1 实践目的 1.掌握linux系统的进入和退出。 2.掌握linux系统用户管理和文件管理。 4.掌握基本的linux命令,加深对文件、目录、文件系统等概念的理解。 5.掌握linux文件系统的目录结构。 6.掌握有关linux文件系统的常用命令。 10.2.2 实践内容 1.Linux的进入和退出 2.用户和用户组管理 3.文件系统管理 4.学习常用的linux命令功能及格式。 2练习使用这些命令及各命令参数。,2020/9/7,22,10.2.3 实践步骤 1. Linux的进入和退出 (1)启动Red Hat Linux系统。 通过LILO启动Red Hat Linux。在LILO提示符boot:下输入想启动的操作系统的名称,或者在LILO提示符下按Tab键,则会看到LILO可以启动的操作系统清单,选择Red Hat Linux就可以启动Red Hat Linux。 从软盘启动Red Hat Linux。将启动软盘插入第一个软盘驱动器,然后接通电源,就可以启动Red Hat Linux。 (2)登录Red Hat Linux。 Red Hat Linux启动成功后,在屏幕上会出现如下的提示信息并且最后的光标闪烁。 Localhost login: _,2020/9/7,23,此时可以登录Red Hat Linux。第一次登录Red Hat Linux须用root账号。这个账号对系统的一切都具有完全的访问权限,用来执行系统管理任务,如创建新的用户账号。在login:提示符后输入root,按Enter键,会出现Password:,要求输入root账号口令,若口令正确,则会出现下面的命令行表示登录成功。 rootlocalhost/root# (3)退出Red Hat Linux。 在用完Red Hat Linux后,必须退出。可以直接输入logout命令,或输入Ctrl + D 组合键,系统将返回到登录状态。 (4)关闭Red Hat Linux. 正常关闭需要输入shutdown命令,此命令只能由root账号执行。,2020/9/7,24,2.用户和用户组管理 Linux为多用户操作系统,多个用户可以通过自己的终端同时联机使用同一台主机。系统的每一个合法用户都有一个惟一的用户名(账号),用户要使用linux系统,必须用linux预先设置的用户名(账号)登录,而不能随意用一个未在系统中注册的用户名登录。每个用户还需要一个口令。 除了登录用户名和口令外,每个用户还有其他一些属性,如:用户ID、用户组ID、主目录、登录shell等。所有用户信息都存放在系统文件/etc/passwd和/etc/group中。 只有root账户才有权进行用户管理。 (1)用户管理。用户管理包括增加、修改和删除用户账号。这些工作可以通过手工编辑有关文件完成,但是最好使用用户管理工具。这里介绍一组简单的基于命令的用户管理工具:useradd、usermod、userdel和基于图形界面的用户管理工具control-panel。,2020/9/7,25,增加一个用户。可以使用useradd命令,用法如下: 例如可用命令#useradd john增加名为john的用户,除了用户名外,其他参数均为默认值。 为了让新用户登录,还要设置登录口令,使用passwd完成。如: rootlocalhost root#passwd john 就会出现“New password:”的提示,输入口令后回车,又会出现“Retype new password:”的提示,让重新输入一次口令,如果两次口令相同,就会提示口令更新成功,并在下一行出现命令行提示符“#”。 修改用户信息。可以使用usermod命令,具体用法请参考手册。 例如,以下命令设置了用户john的账号在2009年7月10日之后无效。 rootlocalhost root#usermod -e 7/10/09 john 删除用户。可以用userdel命令,例如,删除用户john,可以使用以下命令: rootlocalhost root#userdel john 以上userdel的用法只删除用户账号,并不删除其主目录。如果在删除用户时还要删除其主目录,则可以加上选项“-r”。,2020/9/7,26,(2)用户组管理。在linux系统中,每个用户都属于一个或多个用户组。如果一个用户属于一个用户组,则享有该用户组的权限。这样,只需设置用户组的权限,就可以设置一组用户的权限。 增加一个用户组。可以使用groupadd命令。基本用法: groupadd-g gid -o -r -f group 例如,可以用以下命令增加一个名为teachers的用户组: rootlocalhost root#groupadd teachers 结果是在用户组文件/etc/group中增加了一行: teachers:x:507: 修改一个用户组。可以使用groupmod命令,用法如下: groupmod-g gid -o -n name group 例如,可以用以下命令将用户组teachers改名为staff: rootlocalhost root#groupmod -n staff teachers 删除用户组。可以用groupdel命令。该命令的用法很简单,只要在命令后加上要删除的用户组名即可。例如,下面的命令可删除名为staff的用户组: rootlocalhost root#groupdel staff,2020/9/7,27,3文件系统管理 数据和程序文件都存储在块设备上,如硬盘、光盘等,其中的文件是按不同组织方法组织的,形成了不同的文件系统,例如ext2,FAT32、FAT16等。 要想知道linux支持的文件系统,可以显示一下/proc/filesystems 。如果要增加或删除对某个文件系统的支持,可以重新编译内核。 Linux的所有设备(如硬盘、软盘、光盘等)的文件系统都有机地无缝地组成了一个树状文件系统。这与MS DOS/Windows 9x/Windows NT不一样,不是每个分区都有独立的驱动盘符。,2020/9/7,28,(1)安装和卸载文件系统。在访问一个文件系统前,先将文件系统安装到一个安装目录上,根文件系统除外,它在启动时自动安装到根目录上。安装方法有二:一是启动时自动根据文件/etc/fstab安装,二是用mount命令或相关工具手工安装。 手工安装。使用mount命令,用法如下: mount -t type device dir 其中,device为待安装文件系统的块设备名;type为文件系统类型;dir为安装点。例如,将硬盘第一分区上的FAT32文件系统安装到/dosc上以便于访问,则命令行是: rootelocalhost/root#mount -t FAT32/dev/hda1 /dosc 还可以用mount命令来列出系统安装的所有文件系统。 rootlocalhost/root#mount /dev/hda2 on /boot type ext2(rw) /dev/hda7 on /home type ext2(rw),2020/9/7,29,手工卸载。使用umount命令:umount -nrv device | dir 例如,要卸载以上刚安装的文件系统,可以使用以下命令: rootlocalhost/root#umount /dosc 也可以使用以下命令: rootlocalhost/root#umount /dev/hda1 自动安装与卸载。通过文件/etc/fstab可自动安装及卸载文件系统。文件/etc/fstab列出了要安装的文件系统。除注释行的每行描述了一个文件系统,包括设备名、安装点、文件类型、安装选项、备份选项、检查选项,如图10.17。,2020/9/7,30,2020/9/7,31,在大多数情况下,linux系统所使用的文件系统并不经常发生变化,因此,如果将这些经常使用的文件系统存放在文件/etc/fstab之中,则系统在启动时会自动安装这些文件系统,而在系统关闭时能自动卸载它们。 (2)监视文件系统状态。当要显示文件系统的使用情况时,使用命令df。 (3)维护文件系统。对文件系统要定期检查和修补。 最常用的方法是在文件/etc/fstab中将检查选项数值(pass number)设置为大于0的正整数,如1或2,这样系统在启动时会自动检查文件系统的完整性。 另一种方法是直接使用fsck命令来检查文件系统。这是一个前端命令,根据不同的文件系统类型,fsck将调用不同的检查程序,如fsck、 ext2等。 在用fsck检查某一文件系统时,最好先卸载这个文件系统。这保证了在检查该文件系统时,没有其他程序同时也在对它进行操作。 (4)建立文件系统。当增加一个新硬盘或需要改变硬盘上原来分区时,在linux能使用之前,需要对磁盘进行分区和创建文件系统。 创建磁盘分区可以用fdisk命令,创建文件系统可以用mkfs来完成。,2020/9/7,32,4基本命令实践 (1)man命令:显示具有一定格式的在线命令帮助手册,也可以显示某个命令的格式。例如:查命令ls的用法,则命令为: $man ls (2)more命令:在终端上按页显示。例如输入命令man ls 后,屏幕上会滚动,这时可以做如下处理: $man ls|more (3)date命令:显示及修改日期和时间。例如要查看当前的日期和时间,可以如下输入: $date 若想将当前的日期和时间改为12月11日早上9点30分,可以如下输入: $date 12110930,2020/9/7,33,(4) char name120,name220; FILE *fp1,*fp2;,2020/9/7,65,printf(“Input sorfilname:”); scanf(“%s”,name1); printf(“Input desfilname:”); scanf(“%s”,name2); fp1=fopen(name1,”r”); if(fp1=NULL) printf(“Cannot open rfile n”); exit (1); fp2=fopen(name2,”w”); if(fp2=NULL) printf(“Cannot open wfile n”); exit (1); while(c=fgetc(fp1)!=EOF) fputc(c,fp2); fclose(fp1); fclose(fp2); printf(“copy complete!n”); ,2020/9/7,66,3. fork()调用程序调试。录入、编辑、调试、运行程序,记录结果加注释。 #include #include #include #include main() pid_t pid; printf(Now only one processn); printf(Calling fork.n); pid= fork() ; if (! pid) printf(Im the childn); exit(0); else if (pid0) wait(NULL); printf(Im the parent,child has pid %dn,pid); else printf(Fork fail!n); ,2020/9/7,67,4. 管道通信程序调试。录入、编辑、调试、运行程序,记录结果并加注释。 #include #include #include main() int fd2,nbytes; pid_t childpid; char string=Hello! 0; char readbuffer80; pipe(fd); if (childpid=fork()=-1) perror(fork); exit(1); if (childpid=0) close(fd0); write(fd1,string,strlen(string); close(fd1); else close(fd1); nbytes=read(fd0,readbuffer, sizeof(readbuffer); printf(Received string:%sn, readbuffer); close(fd0); ,2020/9/7,68,5Gdb调试 Linux特色源于shell的GNU调试器,称作gdb。gdb可以查看程序的内部结构、打印显示变量值、设断点,单步调试源代码。功能极其强大,适用于调试程序代码中的问题。这里只介绍最基本功能,建议阅读gdb手册。,2020/9/7,69,下面的清单是一个有错误的C源程序bugging.c。,/*- */ 1#include stdio.h 2 3static char buff 256; 4static char* string; 5int main () 6 7printf (Please input a string: ); 8gets (string); 9printf (nYour string is: %sn, string); 10 /*- */ 这个程序简单,目的是接受用户输入,再将用户输入打印出来。其中用了未经初始化的字符串string,编译运行后,出现了Segment Fault 错误: $ gcc -o bugging -g bugging.c $ ./bugging Please input a string: asfd Segmentation fault (core dumped),2020/9/7,70,为了查找该程序中出现的问题,我们利用 gdb,并按如下的步骤进行: (1)运行 gdb bugging 命令,装入 bugging 可执行文件; (2)执行装入的 bugging 命令 run; (3)使用 where 命令查看程序出错的地方; (4)利用 list 命令查看调用 gets 函数附近的代码; (5)唯一能导致gets函数出错的是变量string。用print查看string值; (6)在gdb中,可以直接修改变量值,只要将string取一个合法指针值就可以了,为此,在第8行处设置断点break 8; (7)程序重新运行到第 8行停止,这时用set variable命令修改string值; (8)继续运行,将看到正确的程序运行结果。,2020/9/7,71,6多文件自动编译的实现 在 Unix 上写过程序的人都遇到过 Makefile,尤其是用 C 开发程序的人。用 make 开发和编译程序很方便,但要写一个MakeFile就不简单了,许多人闻 Unix色变。这里只介绍如何利用 GNU Autoconf 及 Automake 这两款软件帮助自动产生Makefile文件的过程,具体细节请参见本书的5.6,相信读者再练习一次会更有收获的。 在开始使用Automake前,首先确认系统里安装有如下的几款GNU软件:Automake、Autoconf、m4、perl和Libtool (如果需要生成shared library)。 建议使用GNU的C/C+ 编译器、GNU Make及其它GNU工具程序作为开发环境,这些工具属于Open Source Software,免费且功能强大。如果使用Red Hat Linux可以找到所有上述软件的rpm文件,FreeBSD也有现成的package可用,也可以自行下载这些软件的源码再安装。,2020/9/7,72,10.6 实践项目六 内存动态分区管理,10.6.1 实践目的 1.掌握内存动态分区的实现方法。 2.进一步掌握内存块的分配策略。 3.掌握内存块申请与释放的算法与实现。 10.6.2 实践内容 写一个程序,模拟实现内存的动态分区分配算法。假设内存大小为100K。 1.分别使用首次适应算法、最佳适应算法分配内存空间。 2.实现对内存空间的释放。 3.显示内存分配情况。,2020/9/7,73,10.6.3 实践程序及分析 本程序的源代码如下: /* 进入程序后可以根据菜单项进入不同的模块 */ /* 1. 使用首次适应算法分配空间 */ /* 2. 使用最佳适应算法分配空间 */ /* 3. 释放-块空间 */ /* 4. 显示内存分配情况 */ /* 5. 退出系统 */ /*-*/ #include #include #include #define MEMSIZE 100 /*定义内存大小为100*/ #define MINSIZE 2 /*分配时如果剩余值小于此值则不再分割*/ typedef struct MemoryInformation /*空间分区表结构*/ int start; /*起始地址*/ int size; /*大小*/ char info; /*状态:f空闲(FREE): u占用(USED); e表结束(END)*/ MEMINFO;,2020/9/7,74,MEMINFO MemListMEMSIZE; void Display(); /*-*/ /*函数名:InitAll() */ /*功能:初始化所有变量。 */ /*-*/ void InitAll() int i; MEMINFO temp=0, 0, e; for(i=0;iMEMSIZE;i+) MemListi=temp; MemList0.start=0; MemList0.size=MEMSIZE; MemList0.info=f; /*-*/,2020/9/7,75,/*函数名FirstFit-new() */ /*功能:使用首次适应算法分配内存 */ /*-*/ void FirstFit_new() int i, j, size; char temp10; printf(How many MEMORY do you require?); scanf(%d, ,2020/9/7,76,if(i=MEMSIZE-1| MemListi.info=e) printf(NOT Enough Memory!n); getchar(); Display(); /*-*/,2020/9/7,77,/*函数名:BestFit_new() */ /*功能:使用最佳适应算法分配内存 */ /*-*/ void BestFit_new() int i, j, k, flag, size; char temp10; printf(How many MEMORY requir?); scanf(%d, ,2020/9/7,78,i=j; if(flag=0) printf(NOT Enough Memory!n); getchar(); else if(MemListi.size-sizei;j-) MemListj+1=MemListj; MemListi+1.start=MemListi.start+size; MemListi+1.size=MemListi.size-size; MemListi+1.info=f; MemListi.size=size; MemListi.info=u; Display(); ,2020/9/7,79,/*-*/ /*函数名:del() */ /*功能:释放-块内存 */ /*-*/ void del( ) int i, number; printf(Please Input the NUMBER you want to delete:); scanf(%d, ,2020/9/7,80,/*-*/ /* 函数名:Display() */* 功能:显示内存状态 */ /*-*/ void Display() int i, used=0; printf(n-n); printf(%5s%15s%15sn, Number, Start, Size, Info); printf(-n); for(i=0;iMEMSIZE ,2020/9/7,81,/*-*/ /*函数名:Main() */ /*功能:主函数 */ /*-*/ main() char ch; InitAll(); while(1) printf( Memory Managern); printf(=n); printf( 1. Get a block use the FIRSTFIT methodn); printf( 2. Get a block use the BESTFIT methodn); printf( 3. Free or delete a blockn); printf( 4. Display Mem infomationn); printf( 5. Exitn); printf(=n); ch=getchar(); switch(ch) case 1:FirstFit_new();break; case 2:BestFit_new();break; case 3:del();break; case 4:Display();break; case 5:exit(0); ,2020/9/7,82,本程序的运行与结果见下图10.18所示,2020/9/7,83,10.7 实践项目七 Linux文件操作编程,10.7.1 实践目的 1.掌握linux文件系统的基本原理、结构和实现的方法。 2.掌握文件的建立、打开、读写、执行、属性等系统调用的使用。 10.7.2 实践内容 1.编写实现两个文件合并的程序。 2.在进程中执行一个文件。编写一个程序,利用fork调用创建一个子进程,并让子进程执行一个可执行文件。 3.将当前进程及父进程的进程标识号加到temp文件,并写入相关信息。,2020/9/7,84,10.7.3 实践源程序清单 1. 编写实现两个文件合并的程序。 main(int argc,char *argv) int fdl,fd2,fd3,n; char buf512, ch=n; fdl=open(argv1,0); fd2=open(argv2,0); fd3=creat(argv3,0644); while(n=read(fdl,buf,512)0) write(fd3,buf,n); /write(fd3, 程序的运行过程与结果如图10.19所示。,2020/9/7,85,2. 编写程序,利用fork调用创建子进程,并让其执行一个可执行文件。 main() int pid; pid=fork(); if (pid0)/*父进程运行*/ wait(0);/*等待子进程结束*/ printf(is completedn); exit(0); if (pid=0)/*子进程运行*/ execl(/bin/ls,ls,(char)0);/*引入并执行ls命令*/ ,2020/9/7,86,运行及调试结果见下图10.20,2020/9/7,87,3.将当前进程及父进程的进程标识号加入temp文件,并写入相关信息。 #include #include #include #include #include #include extern int errno; main() char buf100; int fd,cld_pid; int *status; if (fd=open(temp,O_CREAT|O_TRUNC|O_RDWR)=-1),2020/9/7,88,/*以读/写方式打开temp,若该文件存在则长度置0,不存在则创建*/ printf(open error %dn,errno); exit(1); strcpy(buf,this is parent process writen); if(cld_pid=fork()=0)/*创建子进程*/ /*子进程执行*/ strcpy(buf,this is child process writen); /*将字符串“this is child process writen”复制到buf中*/ printf(this is child process n); printf(My PID(child) is %dn, getpid();/*输出子进程标识*/ printf(My parent PID is %dn, getppid();/*输出父进程标识*/ write(fd, buf,strlen(buf); close(fd); exit(0); ,2020/9/7,89,else /*父进程执行*/ printf(this is parent process n); printf(My PID(parent) is %dn, getpid();/*输出父进程标识*/ printf(My child PID is %dn, cld_pid);/*输出父进程标识*/ write(fd, buf,strlen(buf); close(fd); wait(status);/*等待子进程执行终止*/ exit(0); 本程序的运行与结果见图10.21所示。,2020/9/7,90,10.8 实践项目八 系统调用与设备管理,10.8.1 实践目的 学习如何通过linux系统调用对设备文件进行操作。 10.8.2 实践内容 通过ioctl()对时钟设备文件的操作获取系统当前时钟,并显示时钟。系统调用ioctl()可以对时钟设备进行读写,本实践要求读时钟设备。Linux把所有设备当作文件进行操作,所以读写时钟设备即读写时钟设备文件/dev/rtc。时钟信息包括年月日时分秒,ioctl()读出的时钟信息存放在一个struct rte_time变量中,可以用printf()显示时钟信息,2020/9/7,91,10.8.3 实践源程序清单 #include #include #include #include #include void getmonthstr(char *ptr,int month);/*将读得的月份数值转换为英文形式*/ main() int fd; struct rtc_time rtctime;/*设置一个存放时钟信息的变量*/ char cmonth4,dev_name=/dev/rtc; fd=open(dev_name,O_RDONLY);/*以只读方式打开时钟设备文件*/ if(!fd)/*若无法打开时钟设备,则显示出错信息,然后退出程序*/ fprintf(stderr,Error opening file!n); exit(); ,2020/9/7,92,if(ioctl(fd,RTC_RD_TIME, ,2020/9/7,93,void getmonthstr(char *ptr,int month) switch(month) case 0:strcpy(ptr,Jan);break; case 1:strcpy(ptr,Feb);break; case 2:strcpy(ptr,Mar);break; case 3:strcpy(ptr,Apr);break; case 4:strcpy(ptr,May);break; case 5:strcpy(ptr,Jun);break; case 6:strcpy(ptr,Jul);break; case 7:strcpy(ptr,Aug);break; case 8:strcpy(ptr,Sep);break; case 9:strcpy(ptr,Oct);break; case 10:strcpy(ptr,Nov);break; case 11:strcpy(ptr,Dec);break; 本程序的运行与结果见图10.22所示。,2020/9/7,94,94,Thank you.,Bye Bye,Boys and girls.,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!