1、操作系统常用指令 1 Linux下常用指令 2 2.1 文件与目录操作 2 2.2 备份与压缩 2 2.3 文本处理 3 2.4 Shell指令 4 2.5 打印相关指令 5 2.6 其他基础指令 6 2.7 用户管理 7 2.8 进程管理 7 2.9 磁盘与文件系统管理 8 2.10 内核与性能 9 2.11 x-window系统 9 2.12 系统安全 10 2.13 编程相关指令 10 2.14 其他系统管理与维护指令 10 2.15 网络配置 11 2.16 网络测试与应用 11 2.17 高级网络指令 12 2.18 网络服务器指令 12 2
2、Windows下常用指令 13 2.1 msconfig启动项与系统服务 13 2.2 regedit注册表 13 2.3 cmd或command 13 2.4 dxdiag DirectX诊断工具 14 2.5 devmgmt.msc设备管理器 14 2.6 gpedit.msc组策略 14 2.7 chkdsk Windows磁盘自检程序 14 2.8 control控制面板 14 2.9 compmgmt.msc计算机管理 14 2.10 sysedit系统配置编译器 15 2.11 verifier驱动检测工具 15 2.12 cleanmgr磁盘碎片整理程序
3、15 2.13 taskmgr任务管理器 15 2.14 explorer资源管理器 15 2.15 diskmgmt.msc磁盘管理程序 15 2.16 services.msc服务管理器 15 2.17 regsvr32取消服务或DLL注册 16 2.18 sfc系统文件扫描 16 2.19 msinfo32系统信息 16 2.20 calc计算器 16 2.21 任务管理器 16 2.22 网络连接 17 3 GCC attribute机制 17 1 Linux下常用指令 2.1 文件与目录操作 basename:从文件名中去掉路径和扩展名 cd:切换当
4、前工作目录到指定目录 chgrp:改变文件所属组 chmod:改变文件的权限 chown:改变文件的所有者和组 cp:复制文件或目录 dd:复制文件并转换文件内容 file:确定文件类型 find:在指定目录下查找文件并执行指定的操作 ln:创建文件链接 locate/slocate:快速定位文件的路径 ls/dir/vdir:显示目录内容 mkdir:创建目录 mv:移动或重命名文件 pwd:显示当前工作目录 rename:重命名文件 rm:删除文件或目录 rmdir:删除空目录 touch:修改文件的时间属性 updatedb:创建或更新slocate数
5、据库 whereis:显示指令程序、源代码和man手册页 which:显示指令的绝对路径 2.2 备份与压缩 ar:创建、修改归档文件和从归档文件中提取文件 arj:.arj文件压缩指令 bunzip2:压缩bzip2格式的压缩文件 bzcat:解压缩文件到标准输出 bzip2:创建.bz2格式的压缩文件 bzip2recover:修复损坏的.bz2文件 bzless/bzmore:解压缩.bz2文件并分屏显示内容 compress:压缩数据文件 cpio:存取归档包中的文件 dump:文件系统备份 gunzip:解压缩由gzip压缩的文件 gzexe:压缩可执行
6、程序 gzip:GNU的压缩和解压缩工具 lha:压缩和解压缩指令 resotre:还原由dump备份的文件或文件系统 tar:创建备份档案文件 unarj:解压缩.arj文件 uncompress:解压缩.Z文件 unzip:解压缩.zip文件 zcat:解压缩文件并送到标准输出 zforce:强制gzip格式的文件加上.gz扩展名 zip:压缩文件 zipinfo:显示zip压缩文件的详细信息 znew:将“.Z”文件转换成“.gz”文件 2.3 文本处理 cat:链接文件并显示到标准输出 cksum:检查和计算文件循环冗余校验码 cmp:比较两个文件的差异
7、 col:过滤控制字符 colrm:从输入中过滤掉指定的列 comm:比较两个有序文件的不同 csplit:分割文件 cut:显示文件中每行的指定内容 diff3:比较3个文件的不同 diff:比较并显示两个文件的不同 diffstat:根据diff指令的结果显示统计信息 ed:行文本编辑器 emacs:全屏文本编辑器 ex:文本编辑器 expand:将Tab转换为空白(Space) fmt:最优化文本格式 fold:设置文件显示的行宽 grep/egrep/fgrep:显示文件中匹配的行 head:输出文件开头部分内容 ispell:交互式拼写检查程序 j
8、ed:文本编辑器 joe:编辑文本文件 join:合并两个文件的相同字段 less:分屏查看文本文件 look:显示文件中以特定字符串开头的行 more:分屏查看文本文件 od:以数字编码输出文件内容 paste:合并文件的内容 pico:文本编辑器 sed:流文件编辑器 sort:排序数据文件 spell:拼写检查 split:分割文件 sum:计算并显示文件的校验码 tac:反序显示文件内容 tail:输出文件尾部部分内容 tee:将输入内容复制到标准输出和指定文件 tr:转换或删除文件中的字符 unexpand:将空白(Space)转换为Tab un
9、iq:删除文件中的重复行 vi:全屏文本编辑器 wc:计算文件的字节数、单词数和行数 2.4 Shell指令 alias:定义命令别名 bg:将作业(或任务)放到后台运行 bind:显示或设置键盘配置 declare:声明shell变量 dirs:显示shell目录堆栈中的记录 echo:打印字符串到标准输出 enable:激活与关闭shell内部命令 eval:执行指定指令并返回结果 exec:执行给定指令后退出登录 exit:退出当前shell export:设置与显示环境变量 fc:编辑并执行历史命令 fg:将后台任务(或作业)切换到前台运行 hash:
10、显示与清除指令时运行查询的哈希表 history:显示与操纵历史命令 jobs:显示shell的作业信息 kill:杀死进程或作业 logout:退出登录shell popd:从shell目录堆栈中删除记录 pushd:向shell目录堆栈中添加记录 set:设置shell的执行方式 shopt:设置控制shell行为变量的开关值 ulimit:设置shell的资源限制 umask:设置创建文件的权限掩码 unalias:取消由alias定义的命令别名 unset:删除定义的变量或函数 2.5 打印相关指令 accept:接受打印请求 cancel:取消打印任务
11、 disable:停止打印机 enable:启动打印机 lp:打印文件 lpadmin:配置cups打印机和类 lpc:控制打印机 lpq:显示当前打印队列 lpr:打印文件 lprm:删除当前打印队列中的作业 lpstat:显示CUPS的状态信息 pr:打印前转换文本格式 reject:拒绝打印请求 2.6 其他基础指令 bc:实现精确计算的计算器 cal:显示日历 clear:清屏指令 consoletype:显示当前使用的终端类型 ctrlaltdel:设置热键Ctrl+Alt+Del的功能 date:显示和设置系统日期时间 dircolors:设置l
12、s指令显示时的颜色 eject:弹出可移动设备的介质 halt:关闭计算机 hostid:显示当前主机的数字标识 hwclock:查询和设置系统硬件时钟 info:读取帮助文档 login:登录系统 man:显示联机帮助手册 md5sum:计算并显示文件的md5摘要信息 mesg:设置终端写权限 mtools:显示mtools软件包的指令 mtoolstest:测试并显示mtools工具包的配置 poweroff:关闭计算机并切断电源 reboot:重新启动计算机 shutdown:关闭计算机 sleep:睡眠指定长的时间 stat:显示文件或文件系统的状态
13、talk:与其他用户交谈 wall:向所有终端发送信息 whatis:在数据库中查询关键字 who:显示当前已登录用户的信息 whoami:显示当前用户名 write:向指定用户终端发送信息 yes:不断输出指定字符串 2.7 用户管理 chfn:改变用户的finger信息 chsh:改变用户登录时的默认shell finger:用户信息查询程序 gpasswd:管理组文件/etc/group groupadd:创建组 groupdel:删除组 groupmod:修改组信息 groups:显示用户所属的组 grpck:验证组文件/etc/group的完整性 g
14、rpconv:启用组的影子口令文件 grpunconv:关闭组的影子口令文件 logname:显示登录用户名 passwd:设置用户密码 pwck:验证用户文件密码文件的完整性 pwconv:启用用户的影子口令文件 pwunconv:关闭用户的影子口令文件 su:切换用户 useradd:创建用户 userdel:删除用户 usermod:修改用户的配置信息 users:显示当前登录系统的用户名 2.8 进程管理 init:进程初始化控制 killall:根据名称结束进程 nice:设置进程优先级 nohup:以忽略挂起信号方式运行程序 pgrep:基于名字查
15、询并显示进程号 pidof:查找正在运行程序的进程号 pkill:向指定的进程发送信号 ps:显示系统当前的进程状态 pstree:用树形图显示进程的父子关系 renice:调整进程优先级 w:显示当前登录用户的相关信息 watch:全屏方式显示指定命令的输出信息 2.9 磁盘与文件系统管理 badblocks:磁盘坏块检查工具 blockdev:从命令行调用块设备的ioctl函数 chattr:改变文件的第2扩展文件系统属性 convertquota:转换quota文件格式 df:报告磁盘剩余空间情况 dumpe2fs:显示ext2/ext3文件系统信息 e2f
16、sck:检查ext2/ext3文件系统 e2image:保存ext2/ext3源数据到文件 e2label:设置ext2/ext3文件系统标签 edquota:编辑用户的磁盘空间配额 fdisk:Linux下的分区工具 findfs:查找文件系统 fsck:检查与修复Linux文件系统 grub:Linux下的引导加载器 hdparm:调整硬盘I/O性能 lilo:Linux加载器 lsattr:显示文件的ext2文件系统属性 mkbootdisk:为当前系统创建专门的引导软盘 mke2fs:创建第2扩展文件系统 mkfs:创建各种文件系统 mkinitrd:创建初
17、始化ram磁盘映像文件 mkisofs:创建光盘映像文件 mknod:创建块设备或字符设备文件 mkswap:创建交换分区文件系统 mktemp:创建临时文件 mount:加载文件系统 parted:磁盘分区管理工具 quota:显示用户磁盘配额 quotacheck:创建、检查和修复配额文件 quotaoff:关闭文件系统的磁盘配额功能 quotaon:打开文件系统的磁盘配额功能 quotastat:显示磁盘配额状态 repquota:显示文件系统磁盘配额信息报表 swapoff:关闭交换空间 swapon:激活交换空间 sync:强制将缓存数据写入磁盘 tu
18、ne2fs:调整ext2/ext3文件系统的参数 umount:卸载已经加载的文件系统 2.10 内核与性能 depmod:处理内核可加载模块的依赖关系 dmesg:显示内核的输出信息 free:显示内存使用情况 insmod:加载模块到内核 iostat:报告CPU、I/O设备及分区状态 ipcs:显示进程间通信的状态信息 kernelversion:显示内核主版本号 lsmod:显示已加载的模块 modinfo:显示内核模块信息 modprobe:加载内核模块并解决依赖关系 mpstat:显示进程相关状态信息 rmmod:从内核中删除模块 sar:收集、显示和
19、保存系统活动信息 slabtop:实时显示内核的slab缓存信息 sysctl:运行时修改内核参数 tload:监视系统平均负载情况 top:显示和管理系统进程 uname:显示系统信息 uptime:显示系统运行时间及平均负载 vmstat:显示虚拟内存的状态 2.11 x-window系统 startx:初始化X-Window会话 xauth:X系统授权许可文件管理工具 xhost:显示和配置X服务器的访问权限 xinit:X-Window系统初始化程序 xlsatoms:显示X服务器原子数据定义 xlsclients:显示指定显示器上运行的X程序 xlsfo
20、nts:显示X服务器使用的字体信息 xset:设置X系统的用户偏爱属性 2.12 系统安全 chroot:以指定根目录运行指令 nmap:网络探测工具和安全扫描器 scp:加密的远程复制工具 sftp:安全文件传输工具 slogin:加密的远程登录工具 ssh:加密的远程登录工具 sudo:以另一个用户身份执行指令 2.13 编程相关指令 awk/gawk:模式扫描与处理语言 expr:计算表达式的值 gcc:GNU的C语言编译器 gdb:GNU调试器 ldd:显示共享库依赖 make:工程编译工具 nm:显示目标文件的符号表 perl:perl语言的命令行
21、工具 php:PHP脚本语言命令行接口 test:条件测试 2.14 其他系统管理与维护指令 arch:显示当前主机的硬件架构 at:按照时间安排任务的执行 atq:查询待执行的任务 atrm:删除待执行的任务 batch:在指定时间运行任务 chkconfig:设置系统在不同运行等级下所执行的服务 crontab:按照时间设置计划任务 last:显示以前登录过系统的用户相关信息 lastb:显示登录系统失败的用户相关信息 logrotate:系统日志的轮循工具 logsave:将命令的输出信息保存到日志文件 logwatch:报告和分析系统日志 lsusb:显
22、示所有的USB设备 patch:补丁与更新文件 rpm:Red Hat软件包管理器 runlevel:显示当前系统的运行等级 service:Linux服务管理和控制工具 telinit:切换当前系统的运行等级 yum:RPM软件包自动化管理工具 2.15 网络配置 dnsdomainname:显示系统的DNS域名 domainname:显示和设置主机域名 hostname:显示或者设置系统主机名 ifcfg:配置网络接口 ifconfig:配置网络接口的网络参数 ifdown:关闭指定网络接口 ifup:启动指定网络接口 nisdomainname:显示和设置主
23、机域名 route:显示与操纵本机的IP路由表 ypdomainname:显示和设置主机域名 2.16 网络测试与应用 arp:管理本机arp缓冲区 arping:向相邻主机发送ARP请求报文 arpwatch:监听网络上的ARP信息 dig:域名查询工具 elinks:纯文本网页浏览器 elm:电子邮件客户端程序 ftp:文件传输协议客户端 host:DNS域名查询工具 ipcalc:IP地址计算器 lynx:纯文本网页浏览器 mail:电子邮件管理程序 ncftp:增强的FTP客户端工具 netstat:显示网络状态 nslookup:DNS域名查询工具
24、 pine:电子邮件和新闻组处理程序 ping:测试到达目标主机的网络是否通畅 rsh:远程shell telnet:远程登录工具 tftp:简单文件传输协议客户端 tracepath:追踪数据经过的路由 traceroute:追踪数据包到达目的主机经过的路由 wget:从指定URL地址下载文件 2.17 高级网络指令 arptables:管理内核的ARP规则表 ip:强大的多功能网络配置工具 iptables:IP包过滤与NAT管理工具 iptables-save:保存内核中iptables的配置 iptables-restore:还原iptables的配置信息
25、tcpdump:监听网络流量 2.18 网络服务器指令 ab:Web服务器性能测试 apachectl:Apache HTTP服务器控制接口 exportfs:管理NFS服务器共享的文件系统 htdigest:管理用于摘要认证的用户文件 htpasswd:管理用于基本认证的用户文件 httpd:Apache超文本传输协议服务器 mailq:显示待发送的邮件队列 mysql:MySQL服务器的客户端工具 mysqladmin:MySQL服务器管理工具 msqldump:MySQL服务器备份工具 mysqlimport:MySQL数据库导入工具 mysqlshow:显示M
26、ySQL数据库、表和字段信息 nfsstat:显示网络文件系统状态 sendmail:电子邮件传送代理程序 showmount:显示NFS服务器上的加载信息 smbclient:samba服务器客户端工具 smbmount:加载samba文件系统 smbpasswd:改变samba用户的密码 squid:HTTP代理服务器程序 sshd:OpenSSH守护进程 2 Windows下常用指令 开始->运行 winkey+R 解析:运行中能运行的指令都是在system32目录下的exe、msc和com等文件里 2.1 msconfig启动项与系统服务 最常用
27、的一个程序,“启动”与“服务”项是最多调节的。“启动”项目等同于注册表Run分支。常用于屏蔽一些不愿意其随开机自启动的程序。服务也一样。 2.2 regedit注册表 从略 2.3 cmd或command msdos命令窗口,不同的是,前者是模拟指令界面,后者才是真正的msdos 命令窗口下指令: a.ipconfig /all 显示当前所有网络连接的信息,包括MAC、IP、DNS、掩码、网关 stat -a -o (显示所有正在连接的主机ip及端口号并显示所属进程id) c.telnet和ftp 系统自带远程登陆与文件传输程序 telnet与ftp得到比较大发展,这两方面
28、的经典工具分别是zmud和cuteftp。 send 主机IP或域名/用户名 发送的消息 e.set环境变量设置 指令格式为:set xxx=xxx比如set SystemRoot=C:\windows,注意环境变量的大小写。 主要用来局域网或计算机间发送消息 f.fc比较两个文件的不同 G.mem |more 查看msdos内存使用情况,如果你想玩老dos游戏可能这个指令有帮助,不过这里推荐用dosbox来解决xp下运行老dos程序的兼容性问题。基本上是完美解决。 h.attrib 文件属性修改指令 有4个属性,只读、系统、隐藏和存档。分别对应r/s/h/a,属性前“+”
29、表示赋予,“-”表示取消。 格式是attrib 文件名 参数。比如 attrib +s +h -r i.convert FAT32转NTFS格式指令 具体指令例子 convert D:/FS:NTFS,其中“D:”为可替换磁盘符号 j.ping检测连接程序,一般用于检测网络连接情况,通过域名获得ip。 ping 主机/ip -n 次数 -l 数据包大小。比如 ping -n 20 -l 300表示向中关村在线发送20次大小为300字节的数据。 k.dir、cd、copy、rename、del、format等基本指令从略 2.4 dxdiag DirectX诊断工具 2.5
30、devmgmt.msc设备管理器 2.6 gpedit.msc组策略 2.7 chkdsk Windows磁盘自检程序 2.8 control控制面板 2.9 compmgmt.msc计算机管理 等于右击“我的电脑”->“管理” 2.10 sysedit系统配置编译器 同时打开autoexec.bat、config.sys、win.ini、system.ini4个文件 2.11 verifier驱动检测工具 用于检测当前驱动的潜在隐患,少数莫名其妙的重启由于驱动冲突造成。同时可以查阅所有的驱动文件列表。 2.12 cleanmgr磁盘碎片整理程序 磁盘碎片整理程序,推荐3
31、个月左右整理一次。 2.13 taskmgr任务管理器 等于ctrl+alt+del)任务管理器 2.14 explorer资源管理器 等于winkey+e)资源管理器 2.15 diskmgmt.msc磁盘管理程序 可修改盘符,扫描磁盘错误 2.16 services.msc服务管理器 这里可以对具体服务进行详细的设置,注意这里的依存关系可以提供认识服务作用。至于如何把程序注册为服务,请使用微软的WindowsRKT工具包中的instsrv.exe。该工具包有兴趣的朋友可以至微软主页下载。 2.17 regsvr32取消服务或DLL注册 比如regsvr32 /u zip
32、fldr.dll,取消压缩文件夹 2.18 sfc系统文件扫描 系统文件破坏或有潜在问题时,可以用这个指令来检查并修复(需安装盘),以免重新安装的麻烦。 具体指令 sfc /scannow 现在即扫描所有受保护的系统文件。 2.19 msinfo32系统信息 2.20 calc计算器 呵呵,偶尔用到,计算器。 2.21 任务管理器 任务管理器 用来检测系统状况与结束未相应的非法程序。 1.观察篇 按Ctrl+alt+del打开任务管理器,点“进程” 这里可以看到系统当前正在运行的所有进程,除了注册为服务的程序以外。请注意cpu占用率的情况,如果CPU占用率过高则系统不稳定
33、最后一项是CPU空闲。另外就是可疑进程。 点“性能” 这里特别注意“物理内存”下的“可用数”,基本上决定你的系统是否顺畅。一般200M左右的可用物理内存就说明你的内存应付当前系统绰绰有余。这里还能动态的观察CPU占用率与内存,页面文件使用的情况。 2.使用篇 其实任务管理器与explorer(或者桌面)一样都是独立的操作界面。当你结束进程里的explorer.exe时,就会发现桌面消失,但任务管理器仍正常运行。好像感觉一下子无法入手,其实用这个任务管理器,你完成可以完成很多功能。不过比较麻烦点,但是在你explorer.exe感染病毒时排除问题时特别有效。(现在很多病毒都采用捆绑ex
34、plorer.exe,如果仍用桌面界面则非常麻烦) 点“文件(F)”->“创建新任务” 请注意,这个“创建新任务”的窗口,完全等同于“开始”->“运行”,也就是上述所讲的所有指令都可以在这里运行,当然也可以上网。 同时,点旁边的那个“浏览(B)”,可以使你方便的访问磁盘中的文件及运行。 在“关机(U)”选项里,“注销”可以让你切换用户并自动进入桌面,其他项一目了然。 PS:一般我检测系统是否有毛病或者是否中毒,首先会用任务管理器。可以说,任务管理器是个非常好用的管理工具。大家在具体排除故障时多用就会发现其功能。 ==================== 2.22 网络连接
35、 右击“网上邻居”->“属性”(或点选“网上邻居”按ALT+enter快捷键进入) 1.TCP/IP属性中设置ip/网关/子网掩码/DNS/筛选 右击“本地连接”->“属性”,点TCP/IP协议,点“属性” IP,192.168.x.x/网关,255.255.255.0这个大概都知道设了,如果你是ADSL的话,不用设置DNS,如果有需要可以在msdos中用ipconfig /all来查询本地的DNS。这里说说TCP/IP属性中“高级(V)”->“选项”的TCP/IP筛选。点“属性”进入。可以看到这里面可以自定义开放的端口,这对于你自定电脑的安全非常重要。 2.本地连接属性中对网卡的配
36、置详解。 在本地连接属性中点右上角“配置”按钮,点“高级”在第2项“Link speed/Duplex Mode”可以选择网卡采用10M/100M/1000M半双工还是全双工工作。“Network Address”可以设置ADSL也就是上网时的MAC地址。“Optimal Performance”是否启用网卡的最优化设置,建议名牌网卡且质量好的朋友选上。下面几项默认即可,“wakeup....”是网络唤醒功能的设置。 在“资源”项可以查看冲突与否和资源使用情况如中断号。 3.ADSL拨号 A.双击“网络连接”中的“新建连接向导”(等同于开始->程序->附件->通信->新建连接向导)
37、点“下一步”->“连接到Internet(C)”->“手动设置我的连接”->“用要求用户名和密码的宽带连接”->ISP名称随意->输入电信部门提供给你的用户名与密码->点“完成”后即可建立。 这时在网络连接里本地连接下有个“拨号”下面有个ADSL连接。右击->属性。 “选项”->可以对连接提示与重拨进行设置。 “高级”->连接共享里如果你一条线想多人上网,请打开“允许其他用户通过XXX”项目。 B.多机共享一条宽带的简易方案,特点时对等互不影响,无主机: 1.一个集线器、一个ADSL猫(电信部分送的即可)、若干条网线。 把ADSL猫与集线器的uplink口用网线相连。其他机子通过网
38、线接到集线器的其他口即可。 2.在各自的机子上设置TCP/IP地址,同局域网设置。比如IP/掩码/网关分别设192.168.1.x/255.255.255.0/192.168.1.1。不设也不影响,不过局域网无法通信而已。 3.按上述“A”中新建连接向导的方法建立ADSL拨号,分别在每台建立,设置可以完全一样! 3 GCC attribute机制 GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type
39、 Attribute)。 __attribute__书写特征是:__attribute__前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数。 __attribute__语法格式为: __attribute__ ((attribute-list)) 其位置约束为: 放于声明的尾部“;”之前。 函数属性(Function Attribute) 函数属性可以帮助开发者把一些特性添加到函数声明中,从而可以使编译器在错误检查方面的功能更强大。__attribute__机制也很容易同非GNU应用程序做到兼容之功效。
40、 GNU CC需要使用 –Wall编译器来击活该功能,这是控制警告信息的一个很好的方式。下面介绍几个常见的属性参数。 __attribute__ format 该__attribute__属性可以给被声明的函数加上类似printf或者scanf的特征,它可以使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。该功能十分有用,尤其是处理一些很难发现的bug。 format的语法格式为: format (archetype, string-index, first-to-check) format属性告诉编译器,按照printf, scanf, str
41、ftime或strfmon的参数表格式规则对该函数的参数进行检查。“archetype”指定是哪种风格;“string-index”指定传入函数的第几个参数是格式化字符串;“first-to-check”指定从函数的第几个参数开始按上述规则进行检查。 具体使用格式如下: __attribute__((format(printf,m,n))) __attribute__((format(scanf,m,n))) 其中参数m与n的含义为: m:第几个参数为格式化字符串(format string); n:参数集合中的第一个,即参数“…”里的第一个参数在函数参数总
42、数排在第几,注意,有时函数参数里还有“隐身”的呢,后面会提到; 在使用上,__attribute__((format(printf,m,n)))是常用的,而另一种却很少见到。下面举例说明,其中myprint为自己定义的一个带有可变参数的函数,其功能类似于printf: //m=1;n=2 extern void myprint(const char *format,...) __attribute__((format(printf,1,2))); //m=2;n=3 extern void myprint(int l,const char *format,...)
43、 __attribute__((format(printf,2,3))); 需要特别注意的是,如果myprint是一个函数的成员函数,那么m和n的值可有点“悬乎”了,例如: //m=3;n=4 extern void myprint(int l,const char *format,...) __attribute__((format(printf,3,4))); 其原因是,类成员函数的第一个参数实际上一个“隐身”的“this”指针。(有点C++基础的都知道点this指针,不知道你在这里还知道吗?) 这里给出测试用例:attribute.c,代码如下: 1:
44、 2:extern void myprint(const char *format,...) __attribute__((format(printf,1,2))); 3: 4:void test() 5:{ 6: myprint("i=%d\n",6); 7: myprint("i=%s\n",6); 8: myprint("i=%s\n","abc"); 9: myprint("%s,%d,%d\n",1,2); 10:} 运行$gcc –Wall –c attribute.c attribute后,输出结果为:
45、 attribute.c: In function `test': attribute.c:7: warning: format argument is not a pointer (arg 2) attribute.c:9: warning: format argument is not a pointer (arg 2) attribute.c:9: warning: too few arguments for format 如果在attribute.c中的函数声明去掉__attribute__((format(printf,1,2))),再重新编
46、译,既运行$gcc –Wall –c attribute.c attribute后,则并不会输出任何警告信息。 注意,默认情况下,编译器是能识别类似printf的“标准”库函数。 __attribute__ noreturn 该属性通知编译器函数从不返回值,当遇到类似函数需要返回值而却不可能运行到返回值处就已经退出来的情况,该属性可以避免出现错误信息。C库函数中的abort()和exit()的声明格式就采用了这种格式,如下所示: extern void exit(int) __attribute__((noreturn)); extern void ab
47、ort(void) __attribute__((noreturn)); 为了方便理解,大家可以参考如下的例子: //name: noreturn.c ;测试__attribute__((noreturn)) extern void myexit(); int test(int n) { if ( n > 0 ) { myexit(); /* 程序不可能到达这里*/ } else return 0; } 编译显示的输出信息为: $gcc –W
48、all –c noreturn.c noreturn.c: In function `test': noreturn.c:12: warning: control reaches end of non-void function 警告信息也很好理解,因为你定义了一个有返回值的函数test却有可能没有返回值,程序当然不知道怎么办了! 加上__attribute__((noreturn))则可以很好的处理类似这种问题。把 extern void myexit(); 修改为: extern void myexit() __attribute__((
49、noreturn)); 之后,编译不会再出现警告信息。 __attribute__ const 该属性只能用于带有数值类型参数的函数上。当重复调用带有数值参数的函数时,由于返回值是相同的,所以此时编译器可以进行优化处理,除第一次需要运算外,其它只需要返回第一次的结果就可以了,进而可以提高效率。该属性主要适用于没有静态状态(static state)和副作用的一些函数,并且返回值仅仅依赖输入的参数。 为了说明问题,下面举个非常“糟糕”的例子,该例子将重复调用一个带有相同参数值的函数,具体如下: extern int square(int n) __attribute__((const)); ... for (i = 0; i < 100; i++ ) { total += square(5) + i; } 通过添加__attribute__((const))声明,编译器只调用了函数一次,以后只是直接得到了相同的一个返回值。 事实上,const参数不能用在带有指针类型参数的函数中,因为该属性不但影响函数的参数值,同样也影响到了参数指向的数据,它可能会对代码本身产生严重甚至是不可恢复的严重后果。 并且,带有该属性的






