Linux使用入门
发布日期:2021-07-22 22:18:16
浏览次数:17
分类:技术文章
本文共 34845 字,大约阅读时间需要 116 分钟。
Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ ① 初识LINUX--PC上LINUX系统常规目录结构.................................................................................. 2 准备开始.......................................................................................................................................... 2 根目录(/).......................................................................................................................................... 2 /BIN (二进制)................................................................................................................................. 2 /BOOT (启动).................................................................................................................................. 2 /DEV (设备)................................................................................................................................... 3 /ETC (etc.)...................................................................................................................................... 3 /HOME............................................................................................................................................. 3 /LIB (库)......................................................................................................................................... 3 /LOST+FOUND............................................................................................................................... 4 /MNT (挂接)................................................................................................................................... 4 /OPT (选项)....................................................................................................................................4 /PROC (进程)................................................................................................................................. 4 /ROOT ........................................................................................................................................... 4 /SBIN (系统二进制文件)................................................................................................................ 4 /TMP (临时).................................................................................................................................. 5 /USR (用户).................................................................................................................................... 5 /VAR (变量)................................................................................................................................... 5 /ETC/PASSWD.................................................................................................................................. 6 从另一个角度理解........................................................................................................................... 6 ② LINUX的SHELL命令........................................................................................................................... 6 LINUX的shell是什么?................................................................................................................. 6 学习LINUX最常用的一条shell命令:........................................................................................... 7 现在了解LINUX的shell命令必要吗?.........................................................................................7 建议首先掌握的shell命令:.............................................................................................................8 详细说明一些常用shell命令:...................................................................................................... 8 ③ LINUX上的GCC编译器和GDB调试器....................................................................................... 29 前言................................................................................................................................................ 29 开始学习GCC 编译器................................................................................................................... 30 加入依赖的库................................................................................................................................ 33 用GCC进行代码优化 .................................................................................................................. 34 使用GDB调试器 .......................................................................................................................... 35 ④ 使用在ARM系统的MIZILINUX简介..............................................................................................38 官方文档........................................................................................................................................ 38 使用流程简要介绍......................................................................................................................... 38 miziLinux的目录结构和启动顺序................................................................................................ 39 ⑤ PC上LINUX与WINDOWS的文件共享............................................................................................ 39 Windows上常用的一个软件..........................................................................................................39 Explorer2fs下载............................................................................................................................. 41 Linux访问各种windows分区....................................................................................................... 41 1 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ ① 初识Linux--PC上Linux系统常规目录结构 准备开始 建议首先安装一套Linux系统在你的PC上。 当然,不想真正安装Linux而要进行Linux开发的话也有很多选择,比如 用Virtual PC安装模拟 平台、在Windows程序编制借助Cygwin、在其他平台安装第三方Linux模拟软件等。不过这些选择中除了用 Virtual PC,其他终归是有不少局限性的。而使用Virtual PC等实现的子平台,运行效率和稳定性仍然不 如直接安装Linux作为真正的操作系统。所以如果条件允许的话,还是安装一套作为一个操作系统吧。写此 文时的绝大多数流行Linux系统可以选择在安装后和Windows系统并存。例如 Fedora + Windows XP 、RH9 (RedHat Linux 9.0) + Windows XP 、Fedora + Windows2003 等,都是没有问题的。 Linux在上个世纪就已经有了很多种图形用户界面(GUI),所以当你安装一个流行的Linux以后,上 手几乎和Windows同样轻松。不过我们还是会介绍一些shell命令并建议多使用shell。这样可以给以后阅 读编译脚本、自己建立交叉编译环境等工作带来便利。在图形用户界面打开shell 只需点击菜单中的终端 或者点击运行,输入一个shell的名称并回车,比如bash。 下面介绍一下Linux系统通常的目录结构。以便你对整个系统有一个大概的把握。 你可以一边阅读下文,一边在你的Linux GUI里浏览相应的目录。也许有些地方有出入,但是大体结 构上是一致的。 根目录(/) 根目录在文件系统层次的顶部,我们知道Windows总喜欢用反斜杠(/), 而LINUX用正斜杠(/)表示。 它包含一些标准文件和目录,从某种意义上说,它就是个包括所有文件夹和文件的柜子。 /BIN (二进制) 也称二进制目录,/bin目录包含大多数关键LINUX/UNIX命令的二进制(可执行)映象,这些命令供系 统管理员和用户使用。这个目录中有一些通用命令,包括bash、cat、chmod、cp、date、echo、kill、ln、ls、 mail、mkdir、more、mv、ps、pwd、rm、rmdir、sh、stty、su、tcsh、uname和vi。一些系统恢复命令包括tar、gzip、 gunzip、zcat。/bin目录还包含一些必要的网络命令,包括domainname(或nisdomainname)、hostname、 netstat以及ping。/usr/bin目录包含大多数用户命令。 /BOOT (启动) 该目录包含了启动LINUX时需要的绝大部分文件,它包括LINUX内核的二进制映象f一些系统将配 置文件和内核映射放在其他目录中)。内核文件的名称为vmlinux(vmlinuz),后接版本和发布信息。比如在 2 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ Red Hat LINUX 6.1上,内核是文件/boot/vmlinux-2.2.5 /DEV (设备) /dev目录也称为设备目录,它一般最少包含5个文件,这些文件对应于连接到计算机的设备(终端、磁 盘驱动器、CD-ROM驱动器、磁带驱动器、调制解调器和打印机等)。这些文件被称为块特殊文件,分为两组: 字符特殊文件和块特殊文件。这个目录中的一些文件有:cdromf针对CD-ROM驱动器)、console(针对控制 台)、fd(针对软盘驱动器)、hd(针对硬盘或一个硬盘分区)、isdn(针对ISDN连接)、lp(针对行打印机)、midi (针对midi接口)、pty(针对伪终端)、ram(针对ram磁盘)以及tty(针对终端)。一个系统可能会有好几个类 型的设备。在我使用的的系统上,/dev目录下有2447个文件。/dev/null称为Linux黑洞,在流重定向的 时候常有应用。 /ETC (etc.) /etc目录包含许多专用于主机的文件和目录,这些文件和目录包含了系统配置文件;但不包含任何 二进制文件。该目录中的文件主要由系统管理员使用;但是有读权限的一般用户也可以使用其中大多数文 件。该目录中有一些普通文件和目录,包括:X11、bashrc、csh.10gincrontab,、group、inittab、 lilo.conf.1inuxconf、localtime、motd、passwd、pine.conf、profile、securetty、shells、skel、 syslog.conf、ttytype和zshrc。目录X11包含x Window系统的配置文件。/etc目录下有一些与网络相关 的文件和目录:exports、ftpusers、gateways、host.conf、hosts、hosts.allow、hosts.deny、 hosts.equiv,,hosts.1pd、httpd、等 /HOME 目录/home包含用户的主目录。但是该文件的设置凶主机而异。在小型系统上。该目录包含用户的主目 录,比如/home/bobk。在大型系统上,主机通过使用NFS协议共享主目录,通常将用户主目录再次划分为 许多用户组,比如/home/admin、/home/faculty、home/staff和/home/students。这个方案有许多变化。在 笔者所用的系统中,/home下有43子目录,/home木录包含了用户的主目录,每一个子目录都含有用于 administration、staff,students、faculty的主目录,它们属于不同部门。 /LIB (库) lib目录包含给定语言的相关目标映象文件的集合,这些集合在一个单独的文件中,称为一个归档文 件。一个典型的LINUX/UNIX系统包含了C、C++和FORTRAN库。某种语言的归档文件可用于在该语言中开发的 应用程序。这就允许软件开发者在他们的软件中使用预先写好和测试好的函数。lib目录中的库映象对于启 动系统和运行某些命令是必需的。特别是它包含了标准c库/lib/libc.so.*,数学库libm.so.*,共享动 态链接程序/lib/ld/so,和其他/bin和/sbin中命令所使用的共享库。/lib/modules目录包含了可加载的 内核模块。其余大多数库放在目录/usr/lib下,而目录/lib包含了所有重要的库。 3 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ /LOST+FOUND 目录lost+found包含了系统上与其他任何目录都不相连的所有系统文件。LINUX和UNIX 有一个工具fsck(file system check,文件系统检查)可以找到这些文件,系统管理员可用它检查一个文 件系统,这些文件由系统管理员管理。 /MNT (挂接) 目录/mnt主要用来由系统管理员用命令mount临时加载文件系统。系统上的该目录包含了cdrom、磁 盘和软盘加载点。加载设备时,比如CD-ROM驱动器,访问CD-ROM中的文件就像在目录/mnt/cdrom下访问 文件一样。 /OPT (选项) 目录/opt用于安装附加软件包。用户安装程序包时所调用的程序应该在目录/opt/package_name/bin 中,这里,package_name就是已安装的程序包名称。包的手册页在目录/opt/package_name/man下。 /PROC (进程) 目录/proc包含了进程信息和系统信息。 /ROOT 许多LINUX系统都将目录/root作为根账户的主目录。该目录受到完全保护,不受普通用户的影响。 /SBIN (系统二进制文件) 目录/sbin、/usr/sbin、/usr/local/sbin包含系统管理工具、实用程序和一般的根用户专用命令。/ sbin目录中的一般根用户专用命令包括getty、init、updme、mkswap、swapon和swapoff。用于暂停系统的命 令是:halt、reboot和shutdown。文件系统管理实用程序包括fdisk、fsck、fsck.minix、mkfs、mkfs.ext2、 mkfs.minix、mkfs.msdos和mkfs.vfat。/sbin目录的网络命令最少,它们是ifconng和route。 4 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ /TMP (临时) 一些命令和应用程序要用到该目录。/tmp目录包含临时文件。您也可以用该目录存放自己的临时文件。 该目录中的所有文件会被定期删除,以保证磁盘(或磁盘分区)不会被临时文件所塞满。/tmp目录下某个文 件的生命期是由系统管理员所设定的,而且因系统而异,但通常只有若干分钟。多数系统都为/tmp目录设 置了粘滞位,这样只有文f-$的所有者才能从该目录中删除文件。 /USR (用户) 目录/usr是LINUX/UNIX文件系统中最大的一个部分。它包含了主机之间可以共享的只读数据。在多数 LINUX系统中,/usr至少包含了下面的子目录:X1lR6、b.n、dOC、games、include、lib、local、man、sbin、 share、src和tmp。表中给出了这些目录所含内容的简短说明。 子目录名字 包含的内容概述 X11R6 X Windows 第11版,第6次发布,以及与之相关的文件 bin 用户命今。该目录还包含一些解释程序,如perl、python和tcl等 doc 各种工具、实用程序、库、应用程序和解释程序(如cc、gcc、xfree86、GNOME、) games 游戏和教育软件的可执行文件 include C/C++头文件和包含一些特殊头文件的目录,例如编写网络应用程序(/usr/include/netdb 和/usr/include/netinet等)时所需的头文件、C和C++头文件(/usr/include/g++) lib 目标文件、库函数和内部二进制库(不能被用户或shell脚本直接执行)。 local 系统管理员安装在本地,被多个主机共享的软件(二进制文件和数据)。多数系统的该目 录含以下日录:bin、doc、etc、games、lib、man、sbin、share和src man 实用程序、工具和应用程序的手册页 sbin 系统管理员和守护进程使用的所有无关紧要的命令和工具 share 独立于体系结构的只读数据文件,也就是说,对于相同的操作系统,数据文件可以被不 同平台(Pentium、Alpha和Sparc等)共享 src LINUX/UNIX的源代码和包管理软件的源代码(比如RPM,即RedHat Package management) tmp 到/tmp日录的符号连接 /VAR (变量) 目录/var用于放置变量数据(当系统运行时这些数据不断变化)。该数据在若干个子目录中维护,其中 大多数子目录的讨论不在本书范围之内。其中一个目录是/Var/sp00l/mail,它存放着传入邮件。您阅读的 新邮件就是该目录下的一个文件。一旦您阅读完了该邮件,它就会以一个文件的方式被放进您的主目录, 该目录称为mbox。 5 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ /ETC/PASSWD 文件/etc/passwd对每个用户都有一行描述。每一行由7个字段组成,各个字段用冒号隔开。下面是行 的格式。 login-name:password:user_ID:groupID:user_info:home-directory:login-shell login_name 是登录名,系统通过它了解用户,同时登录名也指出了用户类型。dummy or encrypted_password字段包含伪密码x(或。)或密码的加密版本。如果伪密码放在文件/etc/passwd中。那 么加密的密码就被放在文件/etc/shadow中。user-ID是0到65535之问的整数,这些整数是指定给用户的; 0指定给超级用户,而1-99被保留。group ID标识用户所在的组,group_ID也是0到65535之间的整数, 0-99之间的数也被保留。user info字段包含用户的相关信息,一般是用户全名。home_directory字段包 含用户主目录的绝对路径名。最后一个字段login_shell包含了用户登录shell的绝对路径名。当用户登录 到系统时,相应于该字段所指定路径名的命令就会被系统执行。如果冒号是紧连的,意味着该字段缺少字 段值,有时user info字段会出现这种情况。下面一行来自于我们系统中的文件/etc/passwd,它是描述用 户davis的 davis:x:134:105:James A Davis:/home/student/davis:/bin/bash 在这一行中,登录名为davis,密码字段用x表示,用户ID是134,组ID是105,个人信息是用户的 全名James A Davis,主目录是/home/student/davis,登录shell是/bin/bash。 从另一个角度理解 到此为止,你已经从目录结构上大概的了解了常规Linux的结构。 建议进一步从启动过程的角度了解一下,互联网上有不少这方面的资料。可以google丰富学习。 比如 一个blog中有有关RH9在i386 PC启动的中文叙述: 当然,幻羽资料的后续版本对于应用在S3C2410平台的miziLinux,将有非常详细的启动过程叙述。 ② Linux的shell命令 LINUX的shell是什么? shell是一个重要的LINUX和UNIX的人机接口,因为早期没有图形用户界面的广泛应用。听起来有点 像dos,但是dos是简单的单线程系统,而LINUX如今是一个多进程多用户操作系统。shell本身是LINUX 上的一个进程,他接收你输入的命令来执行。 现在的LINUX系统上,已经有了很多很多种shell。但是基本使用是大同小异的,所以大多数情况下, 即使你不理会你在使用哪种shell问题也不大。 如果没有特别的说明,幻羽科技的文档中的shell都指 Bash,因为这是我最常用的一个shell 6 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ shell命令和dos命令一样,有内部命令和外部命令,在前文的系统目录结构介绍中,已经提到了一 些在bin目录中的外部命令。 学习LINUX最常用的一条shell命令: 在Linux下,当你要查找一个命令的用法,你可以在shell中通过【 man 命令名 】来得到命令的详细 说明。因为每个Linux都有man文档,所以介绍命令的时候我们只是简直介绍一下命令的学用选项。如果想 查看命令的详细说明,请自己看man。下面是man各小节的内容: 1 用户命令。 2 系统调用。 3 库函数。 4 特殊文件(设备和网络接口)。 5 文件格式。 6 游戏和演示。 7 系统环境、表格和宏。 8 系统管理和相关命令。 比如,您想查看ls命令是什么意思,只需要在shell键入 man ls回车 就可以了。 现在了解LINUX的shell命令必要吗? 当您使用LINUX或UNIX系统时,自然会用编辑器和编译器之类的工具创建一般文件。比如在特定的 程序设计语言中,如C、C++和Java,使用文本编辑器,为软件创建代码文件。源代码创建完成,对其进行 编译(如使用gcc)并生成可执行二进制代码。您可以通过shell对您创建的所有这些文本和二进制文件进 行诸如复制、删除、追加、改名、移动、更改权限等操作。当然,更方便的办法也是选用图形用户界面(GUI)。 为了系统地组织工作,应该在主目录下创建一个层次目录结构,并应很好地维护。这就需要进行目录 的创建、复制、移动和删除操作。这样就能遍历您的目录层次,您就能进入一个目录浏览它的内容。LINUX的 shell提供了执行这些任务的所有命令。当然,更方便的办法也是选用图形用户界面(GUI)。 有图形用户界面了,还需要用shell命令吗?当然,并不必须用shell命令完成这些工作,但是充分的 了解shell命令,可以使您更加容易驾御LINUX。比如,如果不了解shell命令,在自己建立一个交叉编译 环境或书写各种配置文件或编辑系统shell脚本的时候,可能会遇到一些困难。 当然,从长远来看,shell命令的使用必然减少,如果所有的地方都有友好的GUI了,谁还去敲命令 7 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 呢续我想这也是M$ (微软) 在20世纪90年代变得这么红火的原因了吧~ 另人兴奋的是,Linux上已经有了 越来越多的在GUI上的快速开发工具。 建议首先掌握的shell命令: 文件系统相关的命令是最常用的,主要有rm(删除文件或目录树)、rmdir(删除目录)、mkdir(创建目 录)、mv(移动和改名)、cp(复制)等。常用的文本创建工具有vi等等。如果您不了解这些命令,建议您首先用 man自行学习。 如果现在你的Linux功底几乎为0,对本文以上描述仍有很多困惑,则建议你阅读幻羽写在本文之前 的Linux入门文档,仍然有问题,请去幻羽论坛提问。 详细说明一些常用shell命令: (示例中$代表shell命令提示符) 1. apropos 依据所给关键字查找相关的命令和系统调用 格式:apropos keyword 例:查找与ftp相关的命令和系统调用 $apropos ftp 注:类似的命令有man -k。man -k 其实就是执行apropos 2. at 在某一特定时间执行指定的命令 格式:at [-V][-q 队列][-f 文件][-m] time 选项说明: 8 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ -V 显示标准的错误输出。 -f 可将作业存在一个文件中,用这个选项指定文件。例如一个shell文件。 -q 指定队列名称,默认为c。 -m 执行后给用户发邮件。 time 指定开始执行的时间。时间格式为: HH:MM,日期格式:MM/DD/YY或MM.DD.YY或MMDDYY。 下面的例 子演示了在2005年3月11日21点34分执行一个at命令。 $at 21:34 03/11/05 执行这条命令后会得到一条warning: commands will be executed using (in order) a)$SHELL b) login shell c)/bin/sh。然后就出现 “at>”的提示符。这时你就可以输入你要执行的命令了,结束后按Ctrl+d。你就可以去喝茶了,到时间后 系统会自动执行它。 相关配置文件: /etc/at.allow 如果这个文件存在,仅允许这个文件里列出的用户使用at。 /etc/at.deny 如果这个文件存在,该文件列出的用户都不能使用at服务。当 这个文件为空时,任何用户 都可以使用at,这是默认配置。 当运行at命令时,先检查/etc/at.allow文件是否存在,如果不存在,再检查 /etc/at.deny文件是否存 在。不管这两个文件是不是存在,root用户都可以执行at命令。 相关命令: 9 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ atq:列出用户待执行的任务,除了root用户的外,每个用户的任务都将被列出。 atrm:通过任务号删除at任务。 batch:当系统负载允许的时候执行命令。比如当负载低于0.8或者一个指定的值时,指行atrun。 3. cat 查看文件内容,从键盘读取数据,合并文件等 格式:cat [-b][-A][-E][-T][-n][-s][-v] 文件名 选项说明: -b 不显示文件中的空行。 -A 相当于 -v -E -T (-vET)。 -E 在文件的每一行行尾加上“$”字符。 -T 将文件中的Tab键用字符“^I”来显示。 -n 在文件的每行前面显示行号。 -s 将连续的多个空行用一个空行来显示。 -v 显示除Tab和Enter之外的所有字符。 下面的命令演示了如何显示file文件中的行号 $cat -n file 4. chmod 修改文件权限 格式:chmod 选项 文件或目录名 10 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 选项说明: u 文件所有者 g 文件所属组 o 其它用户 + 增加权限 - 取消权限 = 赋给权限 a 所有用户 r 读权限 w 写权限 x 执行权限 下面的命令演示了如何使所有用户都可以读写file文件 $chmod a+rw file 5. chown 改变文件所有者 格式:chown [-R][-c][用户名][组名] 文件或目录名 选项说明: -c 文件属主改变时显示说明。 -R/r 改变目录下的文件及其子目录下所有文件的属主。 下面的命令演示了如何改变 dir 目录下的文件及其子目录下的文件的属主为bugboy 11 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ $chown -R bugboy dir 6. cp 复制文件 格式:cp 选项 源文件名 目标文件名 选项说明: -R 复制整个目录。 -f 删除己存在的目标文件。 -i 使用-f遇到删除文件时给出提示。 下面的命令演示了如何把 file 文件复制到当前用户的根目录下 $cp file ~/ 7. crontab 制定计划任务 crontab通过cron服务使用户能够在指定的时间执行某些程序,它通过cron复制,创建列出,删除 crontab文件来管理用户权限和计划。 命令格式:crontab [-u username] [-l] [-e] [-r] 选项说明: -e 编辑当前用户的crontab文件,或者当一个crontab文件不存在时,创建一个crontab 文件。编 辑并保存后文件被当前用户的crontab安装。 12 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ -l 列出当前crontab文件内容。 -r 删除当前用户的crontab文件。 -u username 指定用户名。 crontab文件格式: crontab文件有六个域,每个域之间用空格或者Tab键分开,前五个域都是整数或者*,格式如下(括号里 面是取值范围): 分钟(0-59) 小时(0-23) 日(1-31) 月(1-12) 星期(0-6) 要执行的命令 其中星期取值0指星期日,其它取值递推。前面五个域,每个域都可以用*表示所有合法的值,或者用一个 列表列出合法的值,各值之间用“,”隔开,也可以用“-”表示一个范围。下面的命令演示每个星期,星 期日到星期四晚上23:30分关机。 30 23 * * 0-4 halt -p 下面的例子示出每星期星期一到星期五3:15分清除用户目录下的core文件 15 3 * * 1-5 find $HOME -name core 2>/dev/null |xargs rm -f 下面是一个crontab文件的例子,请用crontab -e 命令编辑。 SHELL=/bin/bash PATH=/usr/bin:/bin:/usr/sbin:/sbin 13 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ MAILTO=bugboy HOME=/home/bugboy 30 23 * * 0-4 halt -p 前面四行定义环境变量,最后一行是执行的命令,你可以定义要执行多个命令。如果你的crontab文件已 经正确编辑,保存退出后会得到一条"crontab:installing new crontab" 的信息。 相关文件: /etc/cron.d/cron.allow 如果这个文件存在,文件中包含的用户名可以使用crontab。 /etc/cron.d/cron.deny 如果这个文件存在,文件中包含的用户不能使用crontab。 你可以自己编辑这两个文件,注意每个用户名占一行。 8. df 查看磁盘剩余空间 格式:df [-t][-x][-k][-p][-a][-m][filename] 选项说明: -t 只输出类型列在fstype中的文件系统。 -x 只输出类型没有列在fstype中的文件系统。 -k 显示空间以K为单位。 -m 显示空间以M为单位。 14 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ -a 将空间为0的文件系统也输出。 filename 指定要查看的文件的大小。 9. fdisk/sfdisk 查看硬盘分区信息 <!--[if !supportLists]-->10. <!--[endif]-->格式:fdisk -l [-u] [device ...] <!--[if !supportLists]-->11. <!--[endif]--> fdisk -s partition 选项说明: -u 列出分区表的时候以扇区的大小代替柱面大小。 -l 列出给定设备的分区表,如果没有给定设备,则列出/proc/partions中设备的分区表。 -s partition 给出partition分区的大小(以块为单位)。 12. file 识别文件类型 格式:file 文件名 13. find 查找文件 格式:find [路径][匹配表达示] 其中匹配表达示有几种类型: -name filename 查找指定名称的文件。 -user username 查找指定用户名的文件。 15 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ -group grpname 查找指定级名的文件。 -print 显示查找的结果。 -size n 查找大小为n块的文件,一块等于512字节。符号“+n”表示查找大小大于n块的文件;符 号“nc”表示查找大小为n个字符的文件,同样的也有符号“+nc”。 -inum n 查找索引结点号(i-node)为n的文件。 -atime n 查找n天前被访问的文件。“+n”表示超过n天前被访问的文件;“-n”表示不超过n天前 被访问的文件。 -mtime n 类似于atime,但是检查的是文件内容被修改的时间。 -ctime n 类似于atime,但检查的是文件索引结点被改变的时间。 -perm mode 查找与给定权限匹配的文件,必须以八进制的形式给出访问权限。 -newer file 查找比指定文件新的文件,即最后修改时间离现在较近。 -exec command 对匹配文件执行command命令,command后用了个大括号包括文件名。command必须以 反斜杠和一个分号结尾。 -ok command 执行command的时候请求用户确认。其它与-exec相同。 例:查找当前目录下所有以.bak结尾的文件,并删除它们 $find . -name "*.bak" -exec rm {} /; 注:这里 *.bak 必须要用单引号或者双引号引起来,或者可以写成/*.bak。 14. head 输出文件内容前面的部分 格式:head [选项][文件]…… 选项说明: 16 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ -n 输出文件的前n行,默认输出10行。 -c 指定输出文件的大小,单位为byte。 15. kill 终止进程 格式:kill [-s|p][-a] PID 选项说明: -s 指明发送给进程的信号。例如-9(强行终止),默认发送TERM信号。 -p 显示进程的ID,不发送信号。 -a 终止所有进程。 0 给所有在当前进程组中的进程发送信号。 -1 给所有进程号大于1的进程发送信号。 16. less 交互式显示文件内容 格式:less 文件名 说明: 可以通过C-v(Page-Down)、C-b(Page-Up)向后向前翻页,C-p、C-n向后向前移一行。这个命令和后面要说的 more命令都可以按q键退出。 17. ln 在文件之间建立链接 格式:ln [-b][-d][-F][-f][-i][-n][-s][-v] 源文件目录文件或目录 17 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 选项说明: -b 为删除的文件建立备份。 -d 允许root用户建立硬链接。 -F 与b相同。 -f 强行删除目标文件。 -i 在删除文件时给出提示。 -n 当目标文件是目录的符号链接时,替代该符号链接。 -s 用符号链接代替硬链接(建立符号链接)。 -v 输出被链接文件的文件名。 18. ls 用于浏览目录,查看当前目录下的文件和文件名 格式:ls [选项] 选项说明: -a 显示所有文件(包括隐藏文件)。 -l 显示文件的详细信息。 -k 显示文件大小,以K为单位。 -color 显示文件时用不同颜色加以区别文件类型。 -d 将根目录作为文件显示。 19. more 一页一页地显示文件内容 格式:more [选项] 文件名 18 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 选项说明: +n 由第n行开始显示 +/str 由含有str字符串的地方开始显示。 20. mount 加载文件系统 格式:mount 磁盘或分区的设备文件 载入点 选项 选项说明: -t 文件系统类型(fat32为vfat) -o 选项 常用的选项有codepage,iocharset(对于中文codepage=936,iocharset=gb2312) -loop 挂载ISO文件时用 举个例子,挂载/dev/hda5到/mnt/wind目录下并且目录支持中文,命令如下: #mount -t vfat /dev/hda5 /mnt/wind -o codepage=936,iocharset=gb2312 21. mv 重命名文件或移动文件 格式:mv [-b][-f][-i][-u][-v] 源文件 目标文件或文件夹 选项说明: -b 为源文件作备份 -f 文件重命名时强制覆盖己有文件。 19 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ -i 覆盖文件时给出提示。 -u 目标文件比源文件新时不覆盖。 -v 移动文件时给出相应的提示。 22. oggenc 压缩音乐文件为.ogg格式 格式:oggenc 文件名 把*.wav文件压缩为*.ogg格式 $oggenc *.wav 同等条件下,ogg会比mp3获得较好的音乐效果 23. ps 查看进程状态 格式:ps [选项] 选项说明: -e/A 列出所有进程。 -u 选择有效的用户ID。 -p 选择指定终端下的进程。 -C 选择指定的文件名。 -f 列出所有详细信息。 -l 按长格式显示。 20 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ -j 按job格式显示。 -x 选择没有控制终端的进程。 24. quota 显示磁盘的使用情况,一般用户可以查看自己使用磁盘的权限 格式:quota [-g][-u][-v][-p] 用户名或组名 选项说明: -g 显示用户所在组使用磁盘的权限。 -u 显示用户自己使用磁盘的权限。 -p 使显示信息简洁化。 25. rename 批量修改文件名 格式:rename from to file... 选项说明: from 源字符。 to 目标字符。 file 要改名的文件 下面的命令演示了把所有文件的后辍由rm改为rmvb $rename .rm .rmvb * 21 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 下面的命令把所有文件名中的大写改为小写 $rename 'tr/A-Z/a-z/' * 26. rpm redhat软件包管理工具 格式:rpm [选项] 文件名|软件包名 选项说明: --version 获得rpm程序的版本信息。 -vv 获得详细的帮助信息。 -v 打印冗长的信息,常与-i选项合用,获得安装进度。 -i 安装软件包。 -U 升级软件包,如果没有旧版的软件包就安装它。 -F 更新软件包,当有旧的软件包的时候。 --force 相当于--replacepkgs,--repalcefiles,--oldpackage。 --nodigest 不验证软件包的独立性。 --nosignature 不验证软件包或者页眉签名。 --nodeps 不检查软件包的安装路径。 --oldpackage 用新软件包替换旧软件包。 --prefix PATH 指定软件包的安装路径。 --relocate OLDPATH=NEWPATH 把原来安装在“OLDPATH”下的软件包重新安装到“NEWPATH”去。 --replacefiles 安装软件包,即使它们替换掉其它的文件。 --replacepkgs 替换掉已经安装的同名软件包。 -e|--erase 软件包名 删除软件包。 --allmatches 删除软件包的所有版本。 -q 查询已经安装的软件包。 22 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ -a 选择所有软件包。 -h 当解开软件包时,打印50个标记,通常与iv选项一起用。 特别说明: 在删除软件包时,软件包的名称不等于安装时的文件名。通常一个rpm包由软件包名称+版本号+发行号+发 行平台+后辍构成。比如有个文件名为bugboy-1.01-1.i386.rpm,那么它的软件包名称是bugboy,版本号是 1.0.1,发行号是1,发行平台是intel 386。 27. rm 删除文件或者目录 格式:rm [-d][-i][-r][-v][-f] 文件名或目录名 选项说明: -d 使用这个选项后,rm大体想当于unlink。 -i 删除每个文件时给用户提示。 -r 删除整个目录,包括文件和子目录。 -v 删除每个文件时给出提示。 -f 强制删除,并且不给提示。 28. sox 转换音频文件 格式:sox [选项] from [选项] to 选项说明: 23 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ -t 文件格式。 -r 采样频率。 例:把file1.wav转换成file1.au文件 $sox file1.wav file1.au 把file1.wav 转换成file1.voc文件,并把采样频率由10000 Hz降为5000 Hz $sox -r 10000 file1.wav -r 5000 file1.voc 减小文件噪音,让文件通过低通滤波器 $sox file1.wav file1.voc lowp 2200 注:对于一些没有许可授权的文件格式,sox不支持 29. su 改变当前用户的ID。 30. tail 输出文件内容后面的部分 格式:tail [选项] 文件名 选项说明: 24 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ -n 只显示后面的n行。 -f 动太显示,常用于跟踪消息文件。 31. tar 解压或压缩文件 格式:tar [选项] 文件[文件1……] 目录[目录1……] 选项说明: -A 将一个tar文件追加到一个存档中。 -c 生成一个新的存档文件。 --delete 从存档中删除。 -r 将文件添加到一个存档的末尾。 -l 列出一个存档的内容。 -u 仅将些存档中内容较新的文件添加到存档中。 -x 从存档中解压缩文件。 -v 详细地列出处理过的文件的信息。 -z 用gzip来处理文件。 --remove-files 将文件解压之后就删除它们。 -Z 用compress来处理文件。 注意:选项中必须包含有A c d r t u x中的一个或多个。 32. top 查看CPU的使用率,修改进程运行优先级 格式:top 选项 25 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 选项说明: -d delay 指定刷新的秒数。 -p pid 查看指定pid的CPU使用率。 默认情况下进程按CPU使用率排序,可按PID(N),时限(A),常驻内存使用率(M),时间(T),和CPU使用 率(P)来排序。 33. type 查看一个命令所在路径 格式:type command 例:查找ls命令所在路径 $type ls 34. umount 卸载系统 格式:umount 磁盘或分区的设备文件(也可以是载入点) 35. useradd 添加用户或更新新创建用户的默认信息 格式:useradd 选项 选项说明: 26 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ -c comment 描述新用户帐号,通常为用户全名。 -d home_dir 设置用户主目录,默认值为用户的登录名,并放在/home目录下。 -D 创建新帐号后保存为新帐号设置的默认信息。 -e expire_date 用MM/DD/YYYY格式设置帐号过期日期。 -f inactivity 设置口令失效时间,该值为0使口令失效后帐号立即失效,为-1使该选项失效。 -g 设置基本组。 -k skel_dir 设置框架目录,该目录包含用户的初始配置文件,创建用户时该目录下的文件都被复制 到用户主目录下。 -m 自动创建用户主目录,并把框架目录(默认为/etc/skel)下的文件复制到用户主目录下。 -M 不创建用户主目录。 -r 允许保留的系统帐号使用用户ID创建一个新帐号。 -s shell 指定用户的登录shell。 -u user_id 设置用户ID。 例:#useradd -m -g users -G Wheel,student -s /bin/sh -c "Yan Dingcheng" bugboy 例用usermod修改用户帐号时各选项与useradd命令相似。 36. userdel 删除用户帐号 格式:userdel username 选项说明: -r 删除帐号时连同帐号主目录一起删除。 27 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 注意:删除用户帐号时非用户主目录下的用户文件并不会被删除,管理员必须以find命令搜索删除这些 文件。下面这条命令删除bugboy用户的所有文件: #find / -user bugboy -exec rm {} /; 37. whatis 查看可以使用的man page和命令的基本功能介绍 例:$whatis top 38. whereis 定位可执行文件、源代码文件、帮助文件在文件系统中的位置 格式:whereis [-bmsu] [BMS 目录名 -f ] 文件名 选项说明: -b 定位可执行文件。 -m 定位帮助文件。 -s 定位源代码文件。 -u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。 -B 指定搜索可执行文件的路径。 -M 指定搜索帮助文件的路径。 -S 指定搜索源代码文件的路径。 39. w 查看登录用户和他们正在做什么 格式:w [-hsfV] [user] 28 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 选项说明: -h 不打印信息头。 -s 使用短格式显示信息。 -f 打印用户来源。 -V 显示版本信息。 40. who 查看当前用户的便当情况 格式:who [-i][-u][-m] 选项说明: -i 显示用户的活动状况。 -u 与-i相同。 -m 显示用户自身的情况。 reboot 重启命令。 halt 关机命令。 ③ Linux上的GCC编译器和GDB调试器 前言 以往在为Linux开发应用程序时,大多数情况下使用的都是C语言,这是古老的Unix历史决定的, 29 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器。目前Linux下最常用的C语言 编译器是GCC(GNU Compiler Collection),它是GNU项目中已经符合ANSI C标准的编译系统,如今已 经能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称 道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等。IA- 64出现以后,在PC的世界里GCC有了针对64位机的重大改变,但是对于ARM来说,GCC用于交叉编 译,还是老样子使用,因此我们的讨论以入门为目标,忽略一些PC领域最新的进展。开放、自由和灵活是 Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。在使用 GCC编译程序时,编译过程可以被细分为四个阶段: ▲ 预处理(Pre-Processing) ▲ 编译(Compiling) ▲ 汇编(Assembling) ▲ 链接(Linking) Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段 的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后 的调试做好准备。和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成 执行效率更高的代码。 GCC提供了30多条警告信息和三个警告级别,使用它们有助于增强程序的稳定性和可移植性。此外, GCC还对标准的C和C++语言进行了大量的扩展,提高程序的执行效率,有助于编译器进行代码优化, 能够减轻编程的工作量。 开始学习GCC 编译器 在学习使用GCC之前,下面的这个例子能够帮助用户迅速理解GCC的工作原理,并将其立即运用 到实际的项目开发中去。首先用熟悉的编辑器输入清单1所示的代码: 清单1:hello.c #include <stdio.h> int main(void) { printf ("Hello world, Linux programming!/n"); return 0; } 然后执行下面的shell命令编译和运行这段程序: # gcc hello.c -o hello # ./hello Hello world, Linux programming! 30 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 从程序员的角度看,只需简单地执行一条GCC命令就可以了,但从编译器的角度来看,却需要完成一系 列非常繁杂的工作。首先,GCC需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中 插入"#include"语句所包含的内容;接着,GCC会调用ccl和as将处理后的源代码编译成目标代码;最后, GCC会调用链接程序ld,把生成的目标代码链接成一个可执行程序。 为了更好地理解GCC的工作过程,可以把上述编译过程分成几个步骤单独进行,并观察每步的运行结果。 第一步是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程: # gcc -E hello.c -o hello.i 此时若查看hello.cpp文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而其它应当被预处理 的宏定义也都做了相应的处理。下一步是将hello.i编译为目标代码,这可以通过使用-c参数来完成: # gcc -c hello.i -o hello.o GCC默认将.i文件看成是预处理后的C语言源代码,因此上述命令将自动跳过预处理步骤而开始执行编译 过程,也可以使用-x参数让GCC从指定的步骤开始编译。最后一步是将生成的目标文件链接成可执行文件: # gcc hello.o -o hello 在采用模块化的设计思想进行软件开发时,通常整个程序是由多个源文件组成的,相应地也就形成了多个 编译单元,使用GCC能够很好地管理这些编译单元。假设有一个由foo1.c和foo2.c两个源文件组成的程序, 为了对它们进行编译,并最终生成可执行程序foo,可以使用下面这条命令: # gcc foo1.c foo2.c -o foo 如果同时处理的文件不止一个,GCC仍然会按照预处理、编译和链接的过程依次进行。如果深究起来,上 面这条命令大致相当于依次执行如下三条命令: # gcc -c foo1.c -o foo1.o # gcc -c foo2.c -o foo2.o # gcc foo1.o foo2.o -o foo 在编译一个包含许多源文件的工程时,若只用一条GCC命令来完成编译是非常浪费时间的。假设项目中 有100个源文件需要编译,并且每个源文件中都包含10000行代码,如果像上面那样仅用一条GCC命令 来完成编译工作,那么GCC需要将每个源文件都重新编译一遍,然后再全部连接起来。很显然,这样浪费 的时间相当多,尤其是当用户只是修改了其中某一个文件的时候,完全没有必要将每个文件都重新编译一 遍,因为很多已经生成的目标文件是不会改变的。要解决这个问题,关键是要灵活运用GCC,同时还要借 助像Make这样的工具。 警告提示功能 31 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ GCC包含完整的出错检查和警告提示功能,它们可以帮助Linux程序员写出更加专业和优美的代码。先来 读读清单2所示的程序,这段代码写得很糟糕,仔细检查一下不难挑出很多毛病: ▲main函数的返回值被声明为void,但实际上应该是int; ▲使用了GNU语法扩展,即使用long long来声明64位整数,不符合ANSI/ISO C语言标准; ▲main函数在终止前没有调用return语句。 清单2:illcode.c #include <stdio.h> void main(void) { long long int var = 1; printf("It is not standard C code!/n"); } 下面来看看GCC是如何帮助程序员来发现这些错误的。当GCC在编译不符合ANSI/ISO C语言标准的源代 码时,如果加上了-pedantic选项,那么使用了扩展语法的地方将产生相应的警告信息: # gcc -pedantic illcode.c -o illcode illcode.c: In function `main': illcode.c:9: ISO C89 does not support `long long' illcode.c:8: return type of `main' is not `int' 需要注意的是,-pedantic编译选项并不能保证被编译程序与ANSI/ISO C标准的完全兼容,它仅仅只能用 来帮助Linux程序员离这个目标越来越近。或者换句话说,-pedantic选项能够帮助程序员发现一些不符合 ANSI/ISO C标准的代码,但不是全部,事实上只有ANSI/ISO C语言标准中要求进行编译器诊断的那些情 况,才有可能被GCC发现并提出警告。 除了-pedantic之外,GCC还有一些其它编译选项也能够产生有用的警告信息。这些选项大多以-W开头, 其中最有价值的当数-Wall了,使用它能够使GCC产生尽可能多的警告信息: # gcc -Wall illcode.c -o illcode illcode.c:8: warning: return type of `main' is not `int' illcode.c: In function `main': illcode.c:9: warning: unused variable `var' GCC给出的警告信息虽然从严格意义上说不能算作是错误,但却很可能成为错误的栖身之所。一个优秀的 Linux程序员应该尽量避免产生警告信息,使自己的代码始终保持简洁、优美和健壮的特性。 在处理警告方面,另一个常用的编译选项是-Werror,它要求GCC将所有的警告当成错误进行处理,这在 使用自动编译工具(如Make等)时非常有用。如果编译时带上-Werror选项,那么GCC会在所有产生警告 的地方停止编译,迫使程序员对自己的代码进行修改。只有当相应的警告信息消除时,才可能将编译过程 继续朝前推进。执行情况如下: 32 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ # gcc -Wall -Werror illcode.c -o illcode cc1: warnings being treated as errors illcode.c:8: warning: return type of `main' is not `int' illcode.c: In function `main': illcode.c:9: warning: unused variable `var' 对Linux程序员来讲,GCC给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更加健壮的程序, 而且还是跟踪和调试程序的有力工具。建议在用GCC编译源代码时始终带上-Wall选项,并把它逐渐培养 成为一种习惯,这对找出常见的隐式编程错误很有帮助。 加入依赖的库 在Linux下开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或 多个函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实际上就是一些头文件(.h)和库 文件(.so或者.a)的集合。虽然Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件 则放到/usr/lib/目录下,但并不是所有的情况都是这样。正因如此,GCC在编译时必须有自己的办法来查找 所需要的头文件和库文件。 GCC采用搜索目录的办法来查找所需要的文件,-I选项可以向GCC的头文件搜索路径中添加新的目 录。例如,如果在/home/xiaowp/include/目录下有编译时所需要的头文件,为了让GCC能够顺利地找到它 们,就可以使用-I选项: # gcc foo.c -I /home/xiaowp/include -o foo 同样,如果使用了不在标准位置的库文件,那么可以通过-L选项向GCC的库文件搜索路径中添加新的目 录。例如,如果在/home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so,为了让GCC能够顺利地找到 它,可以使用下面的命令: # gcc foo.c -L /home/xiaowp/lib -lfoo -o foo 值得好好解释一下的是-l选项,它指示GCC去连接库文件libfoo.so。Linux下的库文件在命名时有一个约定, 那就是应该以lib三个字母开头,由于所有的库文件都遵循了同样的规范,因此在用-l选项指定链接的库 文件名时可以省去lib三个字母,也就是说GCC在对-lfoo进行处理时,会自动去链接名为libfoo.so的文件。 Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),两者 的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。默认情况下,GCC 在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在 编译时加上-static选项,强制使用静态链接库。例如,如果在/home/xiaowp/lib/目录下有链接时所需要的库 文件libfoo.so和libfoo.a,为了让GCC在链接时只用到静态链接库,可以使用下面的命令: 33 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ # gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo 用GCC进行代码优化 代码优化指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合, 目的是改善程序的执行性能。GCC提供的代码优化功能非常强大,它通过编译选项-On来控制优化代码的 生成,其中n是一个代表优化级别的整数。对于不同版本的GCC来讲,n的取值范围及其对应的优化效果 可能并不完全相同,比较典型的范围是从0变化到2或3。 编译时使用选项-O可以告诉GCC同时减小代码的长度和执行时间,其效果等价于-O1。在这一级别上能够 进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。选项-O2告诉GCC除了完成所有-O1级别的优化之外,同时还要进行一些额外的调 整工作,如处理器指令调度等。选项-O3则除了完成所有-O2级别的优化之外,还包括循环展开和其它一些 与处理器特性相关的优化工作。通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越 快。许多Linux程序员都喜欢使用-O2选项,因为它在优化长度、编译时间和代码大小之间,取得了一个比 较理想的平衡点。 下面通过具体实例来感受一下GCC的代码优化功能,所用程序如清单3所示。 清单3:optimize.c #include <stdio.h> int main(void) { double counter; double result; double temp; for (counter = 0; counter < 2000.0 * 2000.0 * 2000.0 / 20.0 + 2020; counter += (5 - 1) / 4) { temp = counter / 1979; result = counter; } printf("Result is %lf/n", result); return 0; } 首先不加任何优化选项进行编译: # gcc -Wall optimize.c -o optimize 借助Linux提供的time命令,可以大致统计出该程序在运行时所需要的时间: 34 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ # time ./optimize Result is 400002019.000000 real 0m14.942s user 0m14.940s sys 0m0.000s 接下去使用优化选项来对代码进行优化处理: # gcc -Wall -O optimize.c -o optimize 在同样的条件下再次测试一下运行时间: # time ./optimize Result is 400002019.000000 real 0m3.256s user 0m3.240s sys 0m0.000s 对比两次执行的输出结果不难看出,程序的性能的确得到了很大幅度的改善,由原来的14秒缩短到了3 秒。这个例子是专门针对GCC的优化功能而设计的,因此优化前后程序的执行速度发生了很大的改变。尽 管GCC的代码优化功能非常强大,但作为一名优秀的Linux程序员,首先还是要力求能够手工编写出高 质量的代码。如果编写的代码简短,并且逻辑性强,编译器就不会做更多的工作,甚至根本用不着优化。 优化虽然能够给程序带来更好的执行性能,但在如下一些场合中应该避免优化代码: ▲ 程序开发的时候 优化等级越高,消耗在编译上的时间就越长,因此在开发的时候最好不要使用优化选 项,只有到软件发行或开发结束的时候,才考虑对最终生成的代码进行优化。 ▲ 资源受限的时候 一些优化选项会增加可执行代码的体积,如果程序在运行时能够申请到的内存资源非 常紧张(如一些实时嵌入式设备),那就不要对代码进行优化,因为由这带来的负面影响可能会产生非常 严重的后果。 ▲ 跟踪调试的时候 在对代码进行优化的时候,某些代码可能会被删除或改写,或者为了取得更佳的性能 而进行重组,从而使跟踪和调试变得异常困难。 使用GDB调试器 一个功能强大的调试器不仅为程序员提供了跟踪程序执行的手段,而且还可以帮助程序员找到解决 问题的方法。对于Linux程序员来讲,GDB(GNU Debugger)通过与GCC的配合使用,为基于Linux的软 件开发提供了一个完善的调试环境。 默认情况下,GCC在编译时不会将调试符号插入到生成的二进制代码中,因为这样会增加可执行文 件的大小。如果需要在编译时生成调试符号信息,可以使用GCC的-g或者-ggdb选项。GCC在产生调试符 35 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 号时,同样采用了分级的思路,开发人员可以通过在-g选项后附加数字1、2或3来指定在代码中加入调试 信息的多少。默认的级别是2(-g2),此时产生的调试信息包括扩展的符号表、行号、局部或外部变量信息。 级别3(-g3)包含级别2中的所有调试信息,以及源代码中定义的宏。级别1(-g1)不包含局部变量和与 行号有关的调试信息,因此只能够用于回溯跟踪和堆栈转储之用。回溯跟踪指的是监视程序在运行过程中 的函数调用历史,堆栈转储则是一种以原始的十六进制格式保存程序执行环境的方法,两者都是经常用到 的调试手段。 GCC产生的调试符号具有普遍的适应性,可以被许多调试器加以利用,但如果使用的是GDB,那么 还可以通过-ggdb选项在生成的二进制代码中包含GDB专用的调试信息。这种做法的优点是可以方便GDB 的调试工作,但缺点是可能导致其它调试器(如DBX)无法进行正常的调试。选项-ggdb能够接受的调试 级别和-g是完全一样的,它们对输出的调试符号有着相同的影响。 需要注意的是,使用任何一个调试选项都会使最终生成的二进制文件的大小急剧增加,同时增加程 序在执行时的开销,因此调试选项通常仅在软件的开发和调试阶段使用。调试选项对生成代码大小的影响 从下面的对比过程中可以看出来: # gcc optimize.c -o optimize # ls optimize -l -rwxrwxr-x 1 xiaowp xiaowp 11649 Nov 20 08:53 optimize (未加调试选项) # gcc -g optimize.c -o optimize # ls optimize -l -rwxrwxr-x 1 xiaowp xiaowp 15889 Nov 20 08:54 optimize (加入调试选项) 虽然调试选项会增加文件的大小,但事实上Linux中的许多软件在测试版本甚至最终发行版本中仍然使用 了调试选项来进行编译,这样做的目的是鼓励用户在发现问题时自己动手解决,是Linux的一个显著特色。 下面还是通过一个具体的实例说明如何利用调试符号来分析错误,所用程序见清单4所示。 清单4:crash.c #include <stdio.h> int main(void) { int input =0; printf("Input an integer:"); scanf("%d", input); printf("The integer you input is %d/n", input); return 0; } 编译并运行上述代码,会产生一个严重的段错误(Segmentation fault)如下: # gcc -g crash.c -o crash # ./crash 36 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ Input an integer:10 Segmentation fault 为了更快速地发现错误所在,可以使用GDB进行跟踪调试,方法如下: # gdb crash GNU gdb Red Hat Linux (5.3post-0.20021129.18rh) ...... (gdb) 当GDB提示符出现的时候,表明GDB已经做好准备进行调试了,现在可以通过run命令让程序开始在 GDB的监控下运行: (gdb) run Starting program: /home/xiaowp/thesis/gcc/code/crash Input an integer:10 Program received signal SIGSEGV, Segmentation fault. 0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6 仔细分析一下GDB给出的输出结果不难看出,程序是由于段错误而导致异常中止的,说明内存操作出了 问题,具体发生问题的地方是在调用_IO_vfscanf_internal ( )的时候。为了得到更加有价值的信息,可以使 用GDB提供的回溯跟踪命令backtrace,执行结果如下: (gdb) backtrace #0 0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6 #1 0xbffff0c0 in ?? () #2 0x4008e0ba in scanf () from /lib/libc.so.6 #3 0x08048393 in main () at crash.c:11 #4 0x40042917 in __libc_start_main () from /lib/libc.so.6 跳过输出结果中的前面三行,从输出结果的第四行中不难看出,GDB已经将错误定位到crash.c中的第11 行了。现在仔细检查一下: (gdb) frame 3 #3 0x08048393 in main () at crash.c:11 11 scanf("%d", input); 使用GDB提供的frame命令可以定位到发生错误的代码段,该命令后面跟着的数值可以在backtrace命令 输出结果中的行首找到。现在已经发现错误所在了,应该将 scanf("%d", input); 改为 scanf("%d", &input); 37 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 完成后就可以退出GDB了,命令如下: (gdb) quit GDB的功能远远不止如此,它还可以单步跟踪程序、检查内存变量和设置断点等。 调试时可能会需要用到编译器产生的中间结果,这时可以使用-save-temps选项,让GCC将预处理代码、汇 编代码和目标代码都作为文件保存起来。如果想检查生成的代码是否能够通过手工调整的办法来提高执行 性能,在编译过程中生成的中间文件将会很有帮助,具体情况如下: # gcc -save-temps foo.c -o foo # ls foo* foo foo.c foo.i foo.s GCC支持的其它调试选项还包括-p和-pg,它们会将剖析(Profiling)信息加入到最终生成的二进制代码 中。剖析信息对于找出程序的性能瓶颈很有帮助,是协助Linux程序员开发出高性能程序的有力工具。在编 译时加入-p选项会在生成的代码中加入通用剖析工具(Prof)能够识别的统计信息,而-pg选项则生成只 有GNU剖析工具(Gprof)才能识别的统计信息。 提醒一点,虽然GCC允许在优化的同时加入调试符号信息,但优化后的代码对于调试本身而言将是 一个很大的挑战。代码在经过优化之后,在源程序中声明和使用的变量很可能不再使用,控制流也可能会 突然跳转到意外的地方,循环语句有可能因为循环展开而变得到处都有,所有这些对调试来讲都将是一场 噩梦。所以,建议在调试的时候最好不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行 优化。 ④ 使用在ARM系统的miziLinux简介 官方文档 在目录“Mizi 官方文档”中,有一个miziLinux 的官方使用文档的离线版本,其中详细介绍了 miziLinux在s3c2410系统使用的方法。 使用流程简要介绍 Linux在嵌入式系统上的移植已经很常见,其中miziLinux是极其成功的商业版本。miziLinux在 s3c2410系统的应用已经很多,比如三星04年的旗舰手机。 作为mizi的用户,按找常规的做法,我们需要: 38 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 1. 按自己的需要配置编译bootloader、linux kernel、busybox、root file system 2. 以某种方式连接开发板的jtag到pc 3. 烧录bootloader(如vivi)到开发板的flash启动区域 4. 启动vivi,并通过串口控制它,格式化flash 5. 通过vivi用串口把bootloader、kernel和busybox传到开发板并烧录到flash的对应区域 6. 复位开发板,进入busybox,在shell对板上的网卡进行配置并等待pc的连接 7. 用网线连接pc,并在pc上的某种终端与开发板建立连接,传送烧录程序(如果当前shell没有 烧录功能)和带有各种用户程序与模块的root file system到开发板 8. 烧录root file system并复位,即可使用板上的miziLinux系统。 9. 编写用户程序,在pc上测试运行,调试完成后通过某种方式烧录到开发板。(也可以在制作file system的时候直接包含已经做好的东西进去) 本光盘里有已经编译好的所有东西(在mizi官方光盘中也有,但不是中文版),您可以直接烧录。 在windows下的烧录方法见文档“在HY2410上使用miziLinux”。 miziLinux的目录结构和启动顺序 miziLinux和pc上常见的RedHat Linux自然有许多不同。MiziLinux的目录结构在制作file system 的时候您可以清楚的看到,而且整个mizi kernel和vivi都是开放源代码的,所以可以很容易的分析它 的工作方式。这方面的详细介绍以及代码注释,幻羽会不断在添加。 ⑤ PC上Linux与Windows的文件共享 Windows上常用的一个软件 考虑到您可能在一台pc上为了便利开发,用Linux和Windows两套系统,总结此文并提供一个小工具。 explore2fs (当然也有很多其他软件,不过都是收费的) Windows 本身没有访问 Linux 分区的程序,因此必须借助于第三方软件。 这是一款免费的绿色软件,下载后只要直接解压到一个目录下,运行 explore2fs.exe 就可以使用了。 Explore2fs 的操作界面类似于 Windows 的资源管理器,窗口的左边是 Linux 分区的目录结构,右边是 所选目录下的内容,目录展开折叠的操作与 Windows 相同。而窗口右边的所有 Linux 文件以小企鹅图标 显示,操作时可以通过右键或菜单栏进行。 39 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ 这时,您可以选择需要拷贝到 Windows 下的一个文件,单击鼠标右键,选择“Export Files”选项将其 保存到 Windows 中即可。而在弹出菜单中选择“View”,还可以调用默认的关联程序打开该文件,而设定 打开程序的关联可以在菜单“View|Options|General|Viewer Program”中选择。 经过以上的步骤,大家可能发现右键菜单中下面几项有关写入的内容都是灰色的,也就是说将 Windows 文件写入 Linux 的操作不能进行,难道是软件不支持吗?并不是,而是软件为了保护 Linux 分区,默认 状态下没有打开写入操作,我们可以选择菜单“View|Options|Debug”,选中其中的“Enable write support”选项,再点击“OK”退出。然后再运行菜单“File|Rescan Partition”,这时会弹出 “COnfirm”窗口,单击“Yes”即可。再看看右键菜单,可以将 Windows 分区的文件写入了。 Explore2fs 支持文件拖放操作,所以你可以将文件直接用鼠标拖进拖出,还可以通过右键的“Import File”功能来向 Linux 分区写入文件。 Explore2fs 除了传送文件外,还支持更改文件的使用权限。只要在文件上点击右键,选择“Properties| Attributes”进行响应修改即可。另外,在右键菜单中还有一个“Create”功能,它下面有三个选项: Block Device、Character Device 和 Symbolic Link,前两个 Linux 系统已经内置好了,不需修改, Symbolic Link则相当于 Windows 的快捷方式。 如果您不知道所有文件的作用,不要随意更改 Linux系统目录下的内容,这可能造成 Linux系统的瘫痪。 本光盘提供了explore2fs的1.07版本,在“Tools”目录中,请在使用前阅读其文档。 40 Linux使用入门 文档版本0.1 幻羽科技 armtronix.net arm888.com/ Explorer2fs下载 这些连接的存在是为了让您能够轻松的找到以上软件的最新版本。 Linux访问各种windows分区 访问fat分区基本上不需要额外的软件,访问ntfs的话,可以到这里安装软件包。 由于Linux版本繁多,这些软件包没有在本光盘中提供。请针对自己的Linux下载。 具体的配置只需要用到mount命令,在此不再赘述。 41转载地址:https://blog.csdn.net/menuconfig/article/details/1753850 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月19日 21时56分20秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
UIScrollView复用节点示例
2021-06-30
Unity 5 AudioMixer
2021-06-30
Unity 代码混淆: CodeGuard的使用
2021-06-30
UGUI 列表循环使用
2021-06-30
使用命令行运行unity并执行某个静态函数(运用于命令行打包和批量打包)
2021-06-30
web.py框架
2021-06-30
web.py学习笔记
2021-06-30
python的代码缩进
2021-06-30
A* Pathfinding Project (Unity A*寻路插件) 使用教程
2021-06-30
bash学习笔记
2021-06-30
sqlite学习
2021-06-30
手把手教你实现Unity与Android的交互
2021-06-30
手把手教你使用Unity的Behavior Designer
2021-06-30
Unity3D摄像机裁剪——NGUI篇
2021-06-30
lua深拷贝一个table
2021-06-30
app运行提示Unable to Initialize Unity Engine
2021-06-30
spring boot 与 Ant Design of Vue 实现修改按钮(十七)
2021-06-30
spring boot 与 Ant Design of Vue 实现删除按钮(十八)
2021-06-30
spring boot 与 Ant Design of Vue 实现新增角色(二十)
2021-06-30