亚洲综合电影,欧美在线视频一区二区三区,在线看国产日韩http://www.shnenglu.com/liu1061/category/7273.html生活和工作都要充滿激情,否則你無(wú)法體會(huì)到淋漓盡致的快樂(lè)與痛苦zh-cnSat, 19 Sep 2009 11:33:52 GMTSat, 19 Sep 2009 11:33:52 GMT60learn sed 參數(shù)http://www.shnenglu.com/liu1061/articles/95101.htmlT.S LiuT.S LiuWed, 02 Sep 2009 07:14:00 GMThttp://www.shnenglu.com/liu1061/articles/95101.htmlhttp://www.shnenglu.com/liu1061/comments/95101.htmlhttp://www.shnenglu.com/liu1061/articles/95101.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/95101.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/95101.html Linux sed 15個(gè)參數(shù)
2008-07-17 23:00:57
版權(quán)聲明:原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章 原始出處 、作者信息和本聲明。否則將追究法律責(zé)任。http://future.blog.51cto.com/26959/88400
一、15個(gè)參數(shù)
1、r 從文件讀入
[root@watchout2 ~]# cat file
1
2
3
4
5
[root@watchout2 ~]# cat newfile
a
b
c
d
e
[root@watchout2 ~]# sed '/a/r file' newfile (讀入文件file,并顯示在newfile文件中匹配行a之后)
a
1
2
3
4
5
b
c
d
e
[root@watchout2 ~]# touch /file
[root@watchout2 ~]# echo "aaaaaaaaaaaaaaaaaaaaaaaaaa" > /file
[root@watchout2 ~]# sed '/a/r /file' newfile  (讀入的文件在不同的路徑)
a
aaaaaaaaaaaaaaaaaaaaaaaaaa
b
c
d
e
[root@watchout2 ~]#
 
2、w寫(xiě)入文件
[root@watchout2 ~]# sed '/a/w bo' newfile
a
b
c
d
e
[root@watchout2 ~]# cat bo ([root@watchout2 ~]# sed -n '/a/w bobo' newfile )
a
 
3、a 追加命令
[root@watchout2 ~]# sed '/b/a \bobo' newfile
a
b
bobo
c
d
e
 
4、i 插入
[root@watchout2 ~]# sed '/a/i \bobo' newfile
bobo
a
b
c
d
e
 
5、n 下一個(gè)
[root@watchout2 ~]# sed -n '/a/{n;p}' newfile(打印匹配行的下一行)
b
 
[root@watchout2 ~]# sed '/a/{n;s/b/c/p}' newfile
a
c
c
c
d
e
 
6、y 變形命令
[root@watchout2 ~]# sed '1,3y/abc/ABC/' newfile
A
B
C
d
e
y命令就是將小寫(xiě)轉(zhuǎn)換成了大寫(xiě),正則表達(dá)式元字符不能使用這個(gè)命令。
 
7、q 退出命令
[root@watchout2 ~]# sed '3q' newfile
a
b
c
打印前三行后退出。
 
8、h命令   是將pattern space 模式空間(臨時(shí)緩沖區(qū))的內(nèi)容復(fù)制到holding buffer保持緩沖區(qū)
9、G命令 是將holding buffer中的內(nèi)容取得,爾后放回pattern space中,且追加到相應(yīng)行的末 尾 
    g命令是將holding buffer 中的內(nèi)容取得,爾后放回pattern space 中,且替換相應(yīng)的行
 
[root@watchout2 ~]# sed -e '/a/h' -e '/d/G' newfile
a
b
c
d
a
e
h命令會(huì)把a(bǔ)匹配行,放入保持緩沖區(qū),G命令會(huì)把保持緩沖區(qū)中的內(nèi)容放入模式空間,并追加到匹配行d的下一行。
 
[root@watchout2 ~]# sed -e '/a/h' -e '$G' newfile
a
b
c
d
e
a
與上相同,只是$代表最后一行。
 
[root@watchout2 ~]# sed -e '/a/h' -e '/b/g' newfile
a
a
c
d
e
[root@watchout2 ~]# sed -e '/a/h' -e '$g' newfile
a
b
c
d
a
 
以上h命令會(huì)把匹配行a,放入保持緩沖區(qū),g命令會(huì)讀取保持緩沖區(qū)的內(nèi)容,將匹配行b(第二個(gè)例子就是$最后一行)替換為a 。注:a將覆蓋匹配行b(第二個(gè)例子就是$最后一行)
 
10、x命令 是pattern space模式空間將被holding buffer保持緩沖區(qū)中的內(nèi)容替換
[root@watchout2 ~]# sed -e '/a/h' -e '/d/x' newfile
a
b
c
a
e
匹配行d 將被匹配行a替換。
 
11、-n選項(xiàng)取消sed的默認(rèn)行為,sed 默認(rèn)行為是-p ,
root:/tmp>sed '/6/p' num   -p參數(shù)打印num的內(nèi)容,爾后匹配“6”在次打印6,所以6會(huì)出現(xiàn)兩次。
1
2
3
4
5
6
6
7
8
root:/tmp>sed -n '/6/p' num  -n選項(xiàng)取消sed的默認(rèn)行為(-p ),所以只打印“6”
6
root:/tmp>
 
12、刪除:d命令
刪除第6行
root:/tmp>sed '6d' num
1
2
3
4
5
7
8
root:/tmp>
 
從第6行刪除到行尾
root:/tmp>sed '6,$d' num
1
2
3
4
5
root:/tmp>
 
d刪除最后一行
root:/tmp>sed '$d' num
1
2
3
4
5
6
7
root:/tmp>
 
d刪除匹配行
root:/tmp>sed '/6/d' num
1
2
3
4
5
7
8
root:/tmp>
 
13、替換:s命令
s表示替換,g表示作用范圍整個(gè)行,如果沒(méi)有g(shù)標(biāo)志則只有每行第一個(gè)被替換
root:/tmp>sed 's/1/8/g' num    (sed默認(rèn)有-p參數(shù)打印搜索后的所有行。如g后面加p,那么匹配行就會(huì)打印兩次)
8
2
3
4
5
6
7
8
root:/tmp>
 
行首“1”開(kāi)頭被替換為“8”
root:/tmp>sed 's/^1/8/g' num
8
2
3
4
5
6
7
8
root:/tmp>
 
&符號(hào)表示替換字符串中被找到的部分,所以每個(gè)數(shù)字后面被追加.6789
root:/tmp>sed 's/[0-9]/&.6789/g' num
1.6789
2.6789
3.6789
4.6789
5.6789
6.6789
7.6789
8.6789
root:/tmp>
 
\(..\) 保存匹配的字符到標(biāo)簽\1中。  s/\(5\)/\1.6789/  藍(lán)色部分保存到標(biāo)簽\1中。從表達(dá)式最左邊開(kāi)始,向右最多可以使用9個(gè)標(biāo)簽
root:/tmp>sed 's/\(5\)/\1.6789/g' num
1
2
3
4
5.6789
6
7
8
root:/tmp>sed 's/\([0-9]\)/\1.6789/g' num
1.6789
2.6789
3.6789
4.6789
5.6789
6.6789
7.6789
8.6789
root:/tmp>
 
s后面的字符是分隔搜索字符串和替換字符串的分隔符。默認(rèn)分隔符是斜杠,不論什么字符緊跟s命令都被認(rèn)為是新的分隔符
root:/tmp>sed 's#6#shell#g' num
1
2
3
4
5
shell
7
8
root:/tmp>
 
14、多點(diǎn)編輯:e命令
root:/tmp>sed -e '1,6d' -e 's/8/8.shell/g' num
7
8.shell
root:/tmp>
 
15、-f  引導(dǎo)sed腳本文件名
 
 
16、選定行的范圍:逗號(hào)
 
從第一行到第五行
root:/tmp>sed -n '1,5p' num
1
2
3
4
5
 
從第一行到第五行,然后在搜索
root:/tmp>sed '1,5s/3/3.linux/g' num
1
2
3.linux
4
5
6
7
8
 
顯示從第三行到行首為6的中間所有行
root:/tmp>sed -n '3,/^6/p' num
3
4
5
6
root:/tmp>
 
 
匹配1和5后面追加“******Total********”
root:/tmp>sed '/1/,/5/s/$/******Total********/g' num
1******Total********
2******Total********
3******Total********
4******Total********
5******Total********
6
7
8
root:/tmp>


T.S Liu 2009-09-02 15:14 發(fā)表評(píng)論
]]>
linux學(xué)習(xí)入門(mén)指令!http://www.shnenglu.com/liu1061/articles/54897.htmlT.S LiuT.S LiuSun, 29 Jun 2008 02:14:00 GMThttp://www.shnenglu.com/liu1061/articles/54897.htmlhttp://www.shnenglu.com/liu1061/comments/54897.htmlhttp://www.shnenglu.com/liu1061/articles/54897.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/54897.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/54897.htmllinux目錄架構(gòu)
/   根目錄
/bin    常用的命令 binary file 的目錄
/boot   存放系統(tǒng)啟動(dòng)時(shí)必須讀取的檔案,包括核心 (kernel) 在內(nèi)
/boot/grub/menu.lst   GRUB設(shè)置
/boot/vmlinuz   內(nèi)核
/boot/initrd     核心解壓縮所需 RAM Disk
/dev    系統(tǒng)周邊設(shè)備     
/etc    系統(tǒng)相關(guān)設(shè)定文件
/etc/DIR_COLORS   設(shè)定顏色
/etc/HOSTNAME   設(shè)定用戶的節(jié)點(diǎn)名
/etc/NETWORKING   只有YES標(biāo)明網(wǎng)絡(luò)存在
/etc/host.conf 文件說(shuō)明用戶的系統(tǒng)如何查詢(xún)節(jié)點(diǎn)名
/etc/hosts 設(shè)定用戶自已的IP與名字的對(duì)應(yīng)表
/etc/hosts.allow 設(shè)置允許使用inetd的機(jī)器使用 
/etc/hosts.deny 設(shè)置不允許使用inetd的機(jī)器使用
/etc/hosts.equiv 設(shè)置遠(yuǎn)端機(jī)不用密碼
/etc/inetd.conf 設(shè)定系統(tǒng)網(wǎng)絡(luò)守護(hù)進(jìn)程inetd的配置
/etc/gateways 設(shè)定路由器
/etc/protocols 設(shè)定系統(tǒng)支持的協(xié)議
/etc/named.boot 設(shè)定本機(jī)為名字服務(wù)器的配置文件
/etc/sysconfig/network-scripts/ifcfg-eth0   設(shè)置IP
/etc/resolv.conf    設(shè)置DNS 
/etc/X11  X Window的配置文件,xorg.conf 或 XF86Config 這兩個(gè) X Server 的設(shè)定檔
/etc/fstab    記錄開(kāi)機(jī)要mount的文件系統(tǒng)
/etc/inittab 設(shè)定系統(tǒng)啟動(dòng)時(shí)init進(jìn)程將把系統(tǒng)設(shè)置成什么樣的runlevel
/etc/issue 記錄用戶登錄前顯示的信息
/etc/group 設(shè)定用戶的組名與相關(guān)信息
/etc/passwd 帳號(hào)信息
/etc/shadow 密碼信息
/etc/sudoers 可以sudo命令的配置文件
/etc/securetty 設(shè)定哪些終端可以讓root登錄
/etc/login.defs 所有用戶登錄時(shí)的缺省配置
/etc/exports 設(shè)定NFS系統(tǒng)用的
/etc/init.d/   所有服務(wù)的預(yù)設(shè)啟動(dòng) script 都是放在這裡的,例如要啟動(dòng)或者關(guān)閉
/etc/xinetd.d/  這就是所謂的 super daemon 管理的各項(xiàng)服務(wù)的設(shè)定檔目錄
/etc/modprobe.conf   內(nèi)核模塊額外參數(shù)設(shè)定
/etc/syslog.conf   日志設(shè)置文件
/home   使用者家目錄
/lib    系統(tǒng)會(huì)使用到的函數(shù)庫(kù)
/lib/modules   kernel 的相關(guān)模塊
/var/lib/rpm   rpm套件安裝處
/lost+found    系統(tǒng)不正常產(chǎn)生錯(cuò)誤時(shí),會(huì)將一些遺失的片段放置於此目錄下
/mnt     外設(shè)的掛載點(diǎn)
/media   與/mnt類(lèi)似
/opt     主機(jī)額外安裝的軟件
/proc    虛擬目錄,是內(nèi)存的映射
/proc/version   內(nèi)核版本
/proc/sys/kernel   系統(tǒng)內(nèi)核功能
/root    系統(tǒng)管理員的家目錄
/sbin    系統(tǒng)管理員才能執(zhí)行的指令
/srv     一些服務(wù)啟動(dòng)之後,這些服務(wù)所需要取用的資料目錄
/tmp     一般使用者或者是正在執(zhí)行的程序暫時(shí)放置檔案的地方
/usr     最大的目錄,存許應(yīng)用程序和文件
/usr/X11R6:   X-Window目錄
/usr/src:    Linux源代碼
/usr/include:系統(tǒng)頭文件
/usr/openwin 存放SUN的OpenWin
/usr/man 在線使用手冊(cè)
/usr/bin           使用者可執(zhí)行的 binary file 的目錄
/usr/local/bin     使用者可執(zhí)行的 binary file 的目錄
/usr/lib           系統(tǒng)會(huì)使用到的函數(shù)庫(kù)
/usr/local/lib     系統(tǒng)會(huì)使用到的函數(shù)庫(kù)
/usr/sbin          系統(tǒng)管理員才能執(zhí)行的指令
/usr/local/sbin    系統(tǒng)管理員才能執(zhí)行的指令
/var   日志文件
/var/log/secure    記錄登入系統(tǒng)存取資料的檔案,例如 pop3, ssh, telnet, ftp 等都會(huì)記錄檔案中
/var/log/wtmp      記錄登入者的訊息資料, last
/var/log/messages  幾乎系統(tǒng)發(fā)生的錯(cuò)誤訊息
/var/log/boot.log  記錄開(kāi)機(jī)或者是一些服務(wù)啟動(dòng)的時(shí)候,所顯示的啟動(dòng)或關(guān)閉訊息
/var/log/maillog   紀(jì)錄郵件存取或往來(lái)( sendmail 與 pop3 )的使用者記錄
/var/log/cron      記錄 crontab 這個(gè)例行性服務(wù)的內(nèi)容
/var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log:
分別是幾個(gè)不同的網(wǎng)路服務(wù)的記錄檔
一些常用的基本命令:
uname -a    查看內(nèi)核版本      
ls -al    顯示所有文件的屬性
pwd         顯示當(dāng)前路徑        
cd -    返回上一次目錄     cd ~    返回主目錄
date s      設(shè)置時(shí)間、日期         
cal      顯示日歷     cal 2006
bc          計(jì)算器具               
man  & info     幫助手冊(cè)
locale     顯示當(dāng)前字體     locale -a    所有可用字體     /etc/sysconfig/i18n設(shè)置文件
LANG=en    使用英文字體            
sync       將數(shù)據(jù)同步寫(xiě)入硬盤(pán)        
shutdonw -h now & half & poweroff  關(guān)機(jī)
reboot     重啟                  
startx  &  init 5   進(jìn)入圖形介面
/work  & ?work    向上、下查找文檔內(nèi)容
chgrp      改變檔案群組  chgrp testing install.log   
chown     改變所屬人   chown root:root install.log
chmod      改變屬性     chmod 777 install.log     read=4  write=2  execute=1
cp   復(fù)制   cp filename
rm   刪除文件  rm -rf filename   強(qiáng)制刪除文件
rmdir   刪除文件夾
mv  移動(dòng)    mv 123.txt 222.txt  重命名
mkdir     創(chuàng)建文件夾
touch     創(chuàng)建文件  更新當(dāng)前時(shí)間
cat       由第一行開(kāi)始顯示     cat |more  分頁(yè)
nl        在內(nèi)容前加行號(hào)
more  &  less   一面一面翻動(dòng)
head -n filename   顯示第N行內(nèi)容
tail -n filename  顯示后N行內(nèi)容
od        顯示非純文檔
df -h 顯示分區(qū)空間
du  顯示目錄或文件的大小
fdisk   分區(qū)設(shè)置    fdisk -l /dev/hda  顯示硬盤(pán)分區(qū)狀態(tài)
mkfs    建立各種文件系統(tǒng)  mkfs -t ext3  /dev/ram15   
fsck    檢查和修復(fù)LINUX檔案
ln      硬鏈接   ln -s  軟件鏈接
whereis   查找命令
locate    查找
find      查找   find / -name "***.***"
which     查看工具
whoami    顯示當(dāng)前用戶
gcc -v    查看GCC版本
chattr +i filename  禁止刪除   chattr -i filename  取消禁止
lsattr    顯示隱藏檔屬性
updatedb  更新資料庫(kù)
mke2fs    格式化   mkfs -t ext3
dd if=/etc/passwd of=/tmp/passwd.bak    備份
mount     列出系統(tǒng)所有的分區(qū)
mount -t iso9660 /dev/cdrom /mnt/cdrom   掛載光盤(pán)
mount -t vfat /dev/fd0 /mnt/floppy       掛載軟盤(pán)
mount -t vfat -o iocharset=utf8,umask=000 /dev/hda2 /mnt/hda2   掛載fat32分區(qū)
mount -t ntfs -o nls=utf8,umask=000 /dev/hda3 /mnt/hda3         掛載ntfs分區(qū)
Linux-NTFS Project:
http://linux-ntfs.sourceforge.net/
umount /mnt/hda3  缷載
ifconfig   顯示或設(shè)置網(wǎng)絡(luò)設(shè)備
service network restart   重啟網(wǎng)卡  
ifdown eth0  關(guān)閉網(wǎng)卡
ifup eth0    開(kāi)啟網(wǎng)卡
clear    清屏
history    歷史記錄       !55  執(zhí)行第55個(gè)指令
stty   設(shè)置終端    stty -a
fdisk /mbr   刪除GRUB
at     僅進(jìn)行一次的工作排程
crontab   循環(huán)執(zhí)行的例行性命令    [e]編輯,[l]顯示,[r]刪除任務(wù)
&       后臺(tái)運(yùn)行程序    tar -zxvf 123.tar.gz & --------->后臺(tái)運(yùn)行
jobs    觀看后臺(tái)暫停的程序   jobs -l
fg      將后臺(tái)程序調(diào)到前臺(tái)   fg n ------>n是數(shù)字,可以指定進(jìn)行那個(gè)程序
bg      讓工作在后臺(tái)運(yùn)行
kill    結(jié)束進(jìn)程    kill -9 PID     [9]強(qiáng)制結(jié)束,[15]正常結(jié)束,[l]列出可用的kill信號(hào)
ps aux  查看后臺(tái)程序   
top     查看后臺(tái)程序   top -d 2    每?jī)擅敫乱淮?nbsp;       top -d 2 -p10604   觀看某個(gè)PID
        top -b -n 2 > /tmp/top.txt ----->將 top 的資訊進(jìn)行 2 次,然後將結(jié)果輸出到 /tmp/top.txt   
pstree   以樹(shù)狀圖顯示程序    [A]以 ASCII 來(lái)連接, 列出PID, [p]列出帳號(hào)
killall   要?jiǎng)h除某個(gè)服務(wù)    killall -9 httpd
free      顯示內(nèi)存狀態(tài)     free -m  -------->以M為單位顯示
uptime    顯示目前系統(tǒng)開(kāi)機(jī)時(shí)間
netstat   顯示網(wǎng)絡(luò)狀態(tài)    netstat -tulnp------>找出目前系統(tǒng)上已在監(jiān)聽(tīng)的網(wǎng)路連線及其 PID
dmesg     顯示開(kāi)機(jī)信息    demsg | more
nice      設(shè)置優(yōu)先權(quán)      nice -n -5 vi & ----->用 root 給一個(gè) nice 植為 -5 ,用於執(zhí)行 vi
renice    調(diào)整已存在優(yōu)先權(quán)
runlevel  顯示目前的runlevel
depmod    分析可載入模塊的相依性
lsmod     顯示已載入系統(tǒng)的模塊
modinfo   顯示kernel模塊的信息
insmod    載入模塊
modprobe   自動(dòng)處理可載入模塊
rmmod     刪除模塊
chkconfig   檢查,設(shè)置系統(tǒng)的各種服務(wù)     chkconfig --list ----->列出各項(xiàng)服務(wù)狀態(tài)
ntsysv     設(shè)置系統(tǒng)的各種服務(wù)
cpio      備份文件

壓縮命令:
*.Z      compress 程式壓縮的檔案;
*.bz2    bzip2 程式壓縮的檔案;
*.gz     gzip 程式壓縮的檔案;
*.tar    tar 程式打包的資料,並沒(méi)有壓縮過(guò);
*.tar.gz tar 程式打包的檔案,其中並且經(jīng)過(guò) gzip 的壓縮
compress filename  壓縮文件  加[-d]解壓  uncompress
gzip filename   壓縮  加[-d]解壓  zcat 123.gz 查看壓縮文件內(nèi)容
bzip2 -z filename  壓縮  加[-d]解壓   bzcat filename.bz2  查看壓縮文件內(nèi)容
tar -cvf /home/123.tar /etc  打包,不壓縮
tar -xvf 123.tar   解開(kāi)包
tar -zxvf /home/123.tar.gz  以gzip解壓
tar -jxvf /home/123.tar.bz2  以bzip2解壓
tar -ztvf /tmp/etc.tar.gz   查看tar內(nèi)容
cpio -covB  > [file|device]   份份
cpio -icduv
帳號(hào)管理
/etc/passwd    系統(tǒng)帳號(hào)信息
/etc/shadow    帳號(hào)密碼信息    經(jīng)MD5 32位加密
     在密碼欄前面加『 * 』『 ! 』禁止使用某帳號(hào)
/etc/group     系統(tǒng)群組信息
/etc/gshadow
newgrp    改變登陸組
useradd  &  adduser    建立新用戶  ---------> useradd -m test  自動(dòng)建立用戶的登入目錄
          useradd -m -g pgroup test --------->指定所屬級(jí)
/etc/default/useradd   相關(guān)設(shè)定
/etc/login.defs       UID/GID 有關(guān)的設(shè)定
passwd    更改密碼 -----------> passwd test
usermod   修改用戶帳號(hào)
userdel   刪除帳號(hào) ----------->userdel -r test
chsh      更換登陸系統(tǒng)時(shí)使用的SHELL   [-l]顯示可用的SHELL;[-s]修改自己的SHELL
chfn      改變finger指令顯示的信息
finger    查找并顯示用戶信息
id        顯示用戶的ID ----------->  id test
groupadd   添加組
groupmod   與usermod類(lèi)似
groupdel   刪除組
su test    更改用戶   su -    進(jìn)入root,且使用root的環(huán)境變量
sudo       以其他身份來(lái)執(zhí)行指令
visudo     編輯/etc/sudoers      加入一行『 test ALL=(ALL) ALL 』
           %wheel ALL = (ALL) ALL               系統(tǒng)里所有wheel群組的用戶都可用sudo
           %wheel ALL = (ALL) NOPASSWD: ALL     wheel群組所有用戶都不用密碼NOPASSWD
       User_Alias ADMPW = vbird, dmtsai, vbird1, vbird3         加入ADMPW組
       ADMPW ALL = NOPASSWD: !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \
       !/usr/bin/passwd root      可以更改使用者密碼,但不能更改root密碼 (在指令前面加入 ! 代表不可)
PAM (Pluggable Authentication Modules, 嵌入式模組)
who & w     看誰(shuí)在線                     
last        最近登陸主機(jī)的信息
lastlog     最近登入的時(shí)間    讀取 /var/log/lastlog
talk        與其他用戶交談
write       發(fā)送信息    write test   [ctrl]+d 發(fā)送
mesg        設(shè)置終端機(jī)的寫(xiě)入權(quán)限    mesg n 禁止接收     mesg y
wall        向所有用戶發(fā)送信息    wall this is q test
mail        寫(xiě)mail   
/etc/default/useradd    家目錄默認(rèn)設(shè)置
quota      顯示磁盤(pán)已使用的空間與限制     quota -guvs ----->秀出目前 root 自己的 quota 限制值
           quota -vu   查詢(xún)
quotacheck   檢查磁盤(pán)的使用空間與限制     quotacheck -avug  ----->將所有的在 /etc/mtab 內(nèi),含有 quota 支援的 partition 進(jìn)行掃瞄
             [-m] 強(qiáng)制掃描  
     quota一定要是獨(dú)立的分區(qū),要有quota.user和quota.group兩件文件,在/etc/fstab添加一句:
     /dev/hda3 /home ext3 defaults,usrquota,grpquota 1 2
     chmod 600 quota*         設(shè)置完成,重啟生效
edquota    編輯用戶或群組的quota  用戶,[g]群組,[p]復(fù)制,[t]設(shè)置寬限期限
           edquota -a yang       edquota -p yang -u young ----->復(fù)制   
quotaon    開(kāi)啟磁盤(pán)空間限制     quotaon -auvg -------->啟動(dòng)所有的具有 quota 的 filesystem
quotaoff   關(guān)閉磁盤(pán)空間限制     quotaoff -a  -------->關(guān)閉了 quota 的限制
repquota -av     查閱系統(tǒng)內(nèi)所有的具有 quota 的 filesystem 的限值狀態(tài)
Quota 從開(kāi)始準(zhǔn)備 filesystem 的支援到整個(gè)設(shè)定結(jié)束的主要的步驟大概是:
1、設(shè)定 partition 的 filesystem 支援 quota 參數(shù):
由於 quota 必須要讓 partition 上面的 filesystem 支援才行,一般來(lái)說(shuō), 支援度最好的是 ext2/ext3 ,
其他的 filesystem 類(lèi)型鳥(niǎo)哥我是沒(méi)有試過(guò)啦! 啟動(dòng) filesystem 支援 quota 最簡(jiǎn)單就是編輯 /etc/fstab ,
使得準(zhǔn)備要開(kāi)放的 quota 磁碟可以支援 quota 囉;
2、建立 quota 記錄檔:
剛剛前面講過(guò),整個(gè) quota 進(jìn)行磁碟限制值記錄的檔案是 aquota.user/aquota.group,
要建立這兩個(gè)檔案就必須要先利用 quotacheck 掃瞄才行喔!
3、編輯 quota 限制值資料:
再來(lái)就是使用 edquota 來(lái)編輯每個(gè)使用者或群組的可使用空間囉;
4、重新掃瞄與啟動(dòng) quota :
設(shè)定好 quota 之後,建議可以再進(jìn)行一次 quotacheck ,然後再以 quotaon 來(lái)啟動(dòng)吧!
開(kāi)機(jī)流程簡(jiǎn)介
1、載入 BIOS 的硬體資訊,並取得第一個(gè)開(kāi)機(jī)裝置的代號(hào);
2、讀取第一個(gè)開(kāi)機(jī)裝置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的開(kāi)機(jī)資訊;
3、載入 Kernel 作業(yè)系統(tǒng)核心資訊, Kernel 開(kāi)始解壓縮,並且嘗試驅(qū)動(dòng)所有硬體裝置;
4、Kernel 執(zhí)行 init 程式並取得 run-level 資訊;
5、init 執(zhí)行 /etc/rc.d/rc.sysinit 檔案;
6、啟動(dòng)核心的外掛模組 (/etc/modprobe.conf);
7、init 執(zhí)行 run-level 的各個(gè)批次檔( Scripts );
8、init 執(zhí)行 /etc/rc.d/rc.local 檔案;
9、執(zhí)行 /bin/login 程式,並等待使用者登入;
10、登入之後開(kāi)始以 Shell 控管主機(jī)。
在/etc/rc.d/rc3.d內(nèi),以S開(kāi)頭的為開(kāi)機(jī)啟動(dòng),以K開(kāi)頭的為關(guān)閉,接著的數(shù)字代表執(zhí)行順序
GRUB vga設(shè)定
彩度\解析度  640x480  800x600  1024x768  1280x1024   bit
    256        769      771      773       775      8 bit
   32768       784      787      790       793     15 bit
   65536       785      788      791       794     16 bit
   16.8M       786      789      792       795     32 bit
./configure    檢查系統(tǒng)信息       ./configure --help | more  幫助信息
make clean     清除之前留下的文件
make           編譯
make install   安裝
rpm -q  ----->查詢(xún)是否安裝             rpm -ql ------>查詢(xún)?cè)撎准械哪夸?br>rpm -qi ----->查詢(xún)套件的說(shuō)明資料       rpm -qc[d] ----->設(shè)定檔與說(shuō)明檔
rpm -ivh  ---->安裝                    rpm -V  -------->查看套件有否更動(dòng)過(guò)
rpm -e  ------>刪除                    rpm -Uvh ------->升級(jí)安裝  
--nodeps ----->強(qiáng)行安裝                --test ----->測(cè)試安裝


T.S Liu 2008-06-29 10:14 發(fā)表評(píng)論
]]>
使用AutoMake輕松生成Makefile(轉(zhuǎn))http://www.shnenglu.com/liu1061/articles/54540.htmlT.S LiuT.S LiuWed, 25 Jun 2008 03:18:00 GMThttp://www.shnenglu.com/liu1061/articles/54540.htmlhttp://www.shnenglu.com/liu1061/comments/54540.htmlhttp://www.shnenglu.com/liu1061/articles/54540.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/54540.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/54540.html 摘要:
在 Unix 上寫(xiě)過(guò)程序的人一般都遇到過(guò) Makefile,尤其是用 C 來(lái)開(kāi)發(fā)程序的人。用 make 來(lái)開(kāi)發(fā)和編譯程序的確很方便,可是要寫(xiě)出一個(gè)MakeFile就不那么簡(jiǎn)單了。偏偏介紹 Makefile 的文件不多,GNU Make 那份印出來(lái)要幾百頁(yè)的文件,光看完 Overview 自己就快要先Over了,難怪許多人聞 Unix色變。本文將介紹如何利用 GNU Autoconf 及 Automake 這兩套軟件來(lái)幫助『自動(dòng)』產(chǎn)生 Makefile 文件,并且讓開(kāi)發(fā)出來(lái)的的軟件可以象 Apache, MySQL 和常見(jiàn)的 GNU 軟件一樣,只要會(huì) ``./configure'', ``make'', ``make install'' 就可以把程序安裝到系統(tǒng)中。如果您有心開(kāi)發(fā) Open Source 的軟件,或只是想在 Unix 系統(tǒng)下寫(xiě)寫(xiě)程序。希望這份介紹文件能幫助您輕松的進(jìn)入 Unix Programming 的殿堂。
1. 簡(jiǎn)介
Makefile 基本上就是『目標(biāo)』(target), 『關(guān)聯(lián)』(dependencies) 和『動(dòng)作』三者所組成的一系列規(guī)則。而 make 就會(huì)根據(jù) Makefile 的規(guī)則來(lái)決定如何編譯 (compile) 和連接 (link) 程式。實(shí)際上,make 可做的不只是編譯和連接程序,例如 FreeBSD 的 port collection 中,Makefile還可以做到自動(dòng)下載遠(yuǎn)程程序,解壓縮 (extract) , 打補(bǔ)丁 (patch),設(shè)定,然后編譯,安裝到系統(tǒng)中。
Makefile 基本結(jié)構(gòu)雖然很簡(jiǎn)單,但是妥善運(yùn)用這些規(guī)則就可以變換出許多不同的花樣。卻也因?yàn)檫@樣,許多剛剛開(kāi)始學(xué)習(xí)寫(xiě)Makefile 時(shí)會(huì)覺(jué)得沒(méi)有規(guī)范可以遵循,每個(gè)人寫(xiě)出來(lái)的Makefile都不大一樣,不知道從哪里下手,而且常常會(huì)受到自己的開(kāi)發(fā)環(huán)境的限制,只要環(huán)境參數(shù)不同或者路徑更改,可能 Makefile 就得跟著修改修改。雖然有 GNU Makefile Conventions (GNU Makefile慣例例)訂出一些使用 GNU 程式設(shè)計(jì)時(shí)撰寫(xiě) Makefile 的一些標(biāo)準(zhǔn)和規(guī)范,但是內(nèi)容很長(zhǎng)而且很復(fù)雜,并且經(jīng)常作一些調(diào)整,為了減輕程序開(kāi)發(fā)人員維護(hù)Makefile 的負(fù)擔(dān),因此出現(xiàn)了Automake。
程序設(shè)計(jì)者只需要寫(xiě)一些預(yù)先定義好的宏 (macro),提交給Automake處理后會(huì)產(chǎn)生一個(gè)可以供 Autoconf 使用的 Makefile.in文件。再配合利用 Autoconf產(chǎn)生的自動(dòng)培植設(shè)置文件 configure 即可產(chǎn)生一份符合符合 GNU Makefile 慣例的 Makeifle 了。
2. 上路之前
在開(kāi)始使用 Automake 之前,首先確認(rèn)你的系統(tǒng)安裝有如下軟件:
 
1.
GNU Automake
2.
GNU Autoconf
3.
GNU m4
4.
perl
5.
GNU Libtool (如果你需要產(chǎn)生 shared library)
建議最好也使用 GNU C/C++ 編譯器 、GNU Make 以及其它 GNU 的工具程序來(lái)作為開(kāi)發(fā)的環(huán)境,這些工具都是屬于 Open Source Software 不但免費(fèi)而且功能強(qiáng)大。如果你是使用 Red Hat Linux 可以找到所有上述軟件的 rpm 文件,F(xiàn)reeBSD 也有現(xiàn)成的 package 可以直接安裝,或也可以自行下載這些軟件的源代碼回來(lái)安裝。下面的示例是在Red Hat Linux 5.2 + CLE2 的環(huán)境下所完成的。
3. 一個(gè)簡(jiǎn)單的例子
Automake 所產(chǎn)生的 Makefile 除了可以做到程式的編譯和連接,也已經(jīng)把如何產(chǎn)生程序文件 (如 manual page, info 文件及 dvi 文件) 的動(dòng)作,還有把源碼文件包裝起來(lái)以供發(fā)布都考慮進(jìn)去了,所以程序源代碼所存放的目錄結(jié)構(gòu)最好符合GNU 的標(biāo)準(zhǔn)慣例,接下來(lái)就用一個(gè)hello.c 來(lái)做為例子。
在工作目錄下建立一個(gè)新的子目錄"devel"',再在 devel 下建立一個(gè)"hello"' 的子目錄,這個(gè)目錄將作為存放 hello這個(gè)程序及其相關(guān)文件的地方:
% mkdir devel
% cd devel
% mkdir hello
% cd hello
用編輯器寫(xiě)一個(gè)hello.c文件,
#include
int main(int argc, char** argv) {
printf(``Hello, GNU!\n'');
return 0;
}
接下來(lái)就要用 Autoconf 及 Automake 來(lái)產(chǎn)生 Makefile 文件了,
1.
用 autoscan 產(chǎn)生一個(gè) configure.in 的原型,執(zhí)行autoscan 后會(huì)產(chǎn)生一個(gè)configure.scan 的文件,可以用它作為 configure.in文件的藍(lán)本。
 
% autoscan
% ls
configure.scan hello.c
2.
編輯 configure.scan文件,如下所示,並且改名為configure.in
dnl Process this file with autoconf to produce a configure script. AC_INIT(hello.c) AM_INIT_AUTOMAKE(hello, 1.0)
dnl Checks for programs.
AC_PROG_CC
dnl Checks for libraries.
dnl Checks for header files.
dnl Checks for typedefs, structures, and compiler characteristics.
dnl Checks for library functions.
AC_OUTPUT(Makefile)
3.
執(zhí)行 aclocal 和 autoconf ,分別會(huì)產(chǎn)生 aclocal.m4 及 configure 兩個(gè)文件
% aclocal
% autoconf
% ls
aclocal.m4 configure configure.in hello.c
4.
編輯 Makefile.am 文件,內(nèi)容如下
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c
5.
執(zhí)行 automake --add-missing ,Automake 會(huì)根據(jù)Makefile.am 文件產(chǎn)生一些文件,包含最重要的 Makefile.in
% automake --add-missing automake: configure.in: installing `./install-sh' automake: configure.in: installing `./mkinstalldirs' automake: configure.in: installing `./missing'
6.
最后執(zhí)行 ./configure ,
% ./configure creating cache ./config.cache checking for a BSD compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking whether make sets ${MAKE}... yes checking for working aclocal... found checking for working autoconf... found checking for working automake... found checking for working autoheader... found checking for working makeinfo... found checking for gcc... gcc checking whether the C compiler (gcc ) works... yes checking whether the C compiler (gcc ) is a cross-compiler... no checking whether we are using GNU C... yes checking whether gcc accepts -g... yes updating cache ./config.cache creating ./config.status creating Makefile
現(xiàn)在你的目錄下已經(jīng)產(chǎn)生了一個(gè) Makefile 檔,下個(gè) ``make'' 指令就可以開(kāi)始編譯 hello.c 成執(zhí)行檔,執(zhí)行 ./hello 和 GNU 打聲招呼吧!
% make gcc -DPACKAGE=\"hello\" -DVERSION=\"1.0\" -I. -I. -g -O2 -c hello.c gcc -g -O2 -o hello hello.o % ./hello Hello! GNU!
你還可以試試 ``make clean'',''make install'',''make dist'' 看看會(huì)有什麼結(jié)果。你也可以把產(chǎn)生出來(lái)的 Makefile 秀給你的老闆,讓他從此對(duì)你刮目相看 :-)
4. 追根問(wèn)底
上述產(chǎn)生Makefile 的過(guò)程和以往自行編寫(xiě)的方式非常不一樣,舍棄傳統(tǒng)自定義make 的規(guī)則,使用 Automake 只需用到一些已經(jīng)定義好的宏就可以了。我們把宏及目標(biāo) (target)寫(xiě)在Makefile.am 文件內(nèi),Automake 讀入 Makefile.am 文件后會(huì)把這一串已經(jīng)定義好的宏展開(kāi)并產(chǎn)生相對(duì)應(yīng)的 Makefile.in 文件,然后再由 configure這個(gè) shell script 根據(jù) Makefile.in 產(chǎn)生合適的Makefile。

利用 autoconf 及 automake產(chǎn)生Makefile 的流程

上圖表示在上一范例中要使用的文件檔案及產(chǎn)生出來(lái)的文件,有星號(hào) (*) 者代表可執(zhí)行文件。在此示例中可由 Autoconf 及 Automake 工具所產(chǎn)生的額外文件有 configure.scan、aclocal.m4、configure、Makefile.in,需要自行加入設(shè)置的有configure.in 及 Makefile.am。
4.1 編輯 configure.in 文件
Autoconf 是用來(lái)產(chǎn)生 'configure'文件的工具。'configure' 是一個(gè) shell script,它可以自動(dòng)設(shè)定原始程序以符合各種不同平臺(tái)上Unix 系統(tǒng)的特性,并且根據(jù)系統(tǒng)參數(shù)及環(huán)境產(chǎn)生合適的Makefile文件或C 的頭文件(header file),讓原始程式可以很方便地在不同的平臺(tái)上進(jìn)行編譯。Autoconf會(huì)讀取 configure.in 文件然后產(chǎn)生'configure' 這個(gè) shell script。
configure.in 文件內(nèi)容是一系列GNU m4 的宏,這些宏經(jīng)autoconf處理后會(huì)變成檢查系統(tǒng)特性的shell scripts。 configure.in 內(nèi)宏的順序并沒(méi)有特別的規(guī)定,但是每一個(gè)configure.in 文件必須在所有宏前加入 AC_INIT 宏,然后在所有宏的最后加上 AC_OUTPUT宏。可先用 autoscan 掃描原始文件以產(chǎn)生一個(gè) configure.scan 文件,再對(duì) configure.scan 做些修改成 configure.in 文件。在范例中所用到的宏如下:
dnl
這個(gè)宏后面的字不會(huì)被處理,可以視為注釋
AC_INIT(FILE)
該宏用來(lái)檢查源代碼所在路徑,autoscan 會(huì)自動(dòng)產(chǎn)生,一般無(wú)須修改它。
AM_INIT_AUTOMAKE(PACKAGE,VERSION)
這個(gè)是使用 Automake 所必備的宏,PACKAGE 是所要產(chǎn)生軟件套件的名稱(chēng),VERSION 是版本編號(hào)。
AC_PROG_CC
檢查系統(tǒng)可用的C編譯器,若源代碼是用C寫(xiě)的就需要這個(gè)宏。
AC_OUTPUT(FILE)
設(shè)置 configure 所要產(chǎn)生的文件,若是Makefile ,configure 便會(huì)把它檢查出來(lái)的結(jié)果帶入 Makefile.in 文件后產(chǎn)生合適的 Makefile。
實(shí)際上,這里使用 Automake 時(shí),還需要一些其他的宏,這些額外的宏我們用 aclocal來(lái)幫助產(chǎn)生。執(zhí)行 aclocal會(huì)產(chǎn)生aclocal.m4 文件,如果無(wú)特別的用途,可以不需要修改它,用 aclocal 所產(chǎn)生的宏會(huì)告訴 Automake如何動(dòng)作。
有了 configure.in 及 aclocal.m4兩個(gè)文件以后,便可以執(zhí)行 autoconf來(lái)產(chǎn)生 configure 文件了。
4.2 編輯Makefile.am 文件
接下來(lái)要編輯Makefile.am 文件,Automake 會(huì)根據(jù) configure.in 中的宏把Makefile.am 轉(zhuǎn)成 Makefile.in 文件。 Makefile.am 文件定義所要產(chǎn)生的目標(biāo):
AUTOMAKE_OPTIONS
設(shè)置 automake 的選項(xiàng)。Automake 主要是幫助開(kāi)發(fā) GNU 軟件的人員來(lái)維護(hù)軟件,所以在執(zhí)行 automake 時(shí),會(huì)檢查目錄下是否存在標(biāo)準(zhǔn) GNU 軟件中應(yīng)具備的文件,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件。設(shè)置 foreign 時(shí),automake 會(huì)改用一般軟件的標(biāo)準(zhǔn)來(lái)檢查。
bin_PROGRAMS
定義要產(chǎn)生的執(zhí)行文件名。如果要產(chǎn)生多個(gè)執(zhí)行文件,每個(gè)文件名用空白符隔開(kāi)。
hello_SOURCES
定義 'hello' 這個(gè)執(zhí)行程序所需要的原始文件。如果 'hello'這個(gè)程序是由多個(gè)原始文件所產(chǎn)生,必須把它所用到的所有原始文件都列出來(lái),以空白符隔開(kāi)。假設(shè) 'hello' 還需要 'hello.c'、'main.c'、'hello.h' 三個(gè)文件的話,則定義
hello_SOURCES= hello.c main.c hello.h
如果定義多個(gè)執(zhí)行文件,則對(duì)每個(gè)執(zhí)行程序都要定義相對(duì)的filename_SOURCES。
編輯好 Makefile.am 文件,就可以用 automake --add-missing來(lái)產(chǎn)生 Makefile.in。加上 --add-missing 選項(xiàng)來(lái)告訴 automake順便假如包裝一個(gè)軟件所必須的文件。Automake產(chǎn)生生出來(lái)的 Makefile.in 文件是完全符合 GNU Makefile 的慣例,只要執(zhí)行 configure這個(gè)shell script 便可以產(chǎn)生合適的 Makefile 文件了。
4.3 使用 Makefile
利用 configure 所產(chǎn)生的 Makefile文件有幾個(gè)預(yù)先設(shè)定的目標(biāo)可供使用,這里只用幾個(gè)簡(jiǎn)述如下:
make all
產(chǎn)生設(shè)定的目標(biāo),既次范例中的執(zhí)行文件。只敲入make 也可以,此時(shí)會(huì)開(kāi)始編譯源代碼,然后連接并產(chǎn)生執(zhí)行文件。
make clean
清除之前所編譯的執(zhí)行文件及目標(biāo)文件(object file, *.o)。
make distclean
除了清除執(zhí)行文件和目的文件以外,也把 configure 所產(chǎn)生的 Makefile 清除掉。
make install
將程序安裝到系統(tǒng)中,若源碼編譯成功,且執(zhí)行結(jié)果正確,便可以把程序安裝到系統(tǒng)預(yù)先設(shè)定的執(zhí)行文件存放路徑中,若用 bin_PROGRAMS 宏的話,程序會(huì)被安裝到 /usr/local/bin下。
make dist
將程序和相關(guān)的文檔包裝為一個(gè)壓縮文檔以供發(fā)布 (distribution) 。執(zhí)行完在目錄下會(huì)產(chǎn)生一個(gè)以PACKAGE-VERSION.tar.gz 為名稱(chēng)的文件。PACKAGE 和 VERSION 這兩個(gè)參數(shù)是根據(jù) configure.in 文件中 AM_INIT_AUTOMAKE(PACKAGE, VERSION) 的定義。在此范例中會(huì)產(chǎn)生 'hello-1.0.tar.gz' 的文件。
make distcheck
和 make dist 類(lèi)似,但是加入檢查包裝以后的壓縮文件是否正常,這個(gè)目標(biāo)除了把程序和相關(guān)文檔包裝成 tar.gz 文件外,還會(huì)自動(dòng)把這個(gè)壓縮文件解開(kāi),執(zhí)行 configure,并執(zhí)行 make all ,確認(rèn)編譯無(wú)錯(cuò)誤以后,戶顯示這個(gè) tar.gz 文件已經(jīng)準(zhǔn)備好可以發(fā)布了。這個(gè)檢查非常有用,檢查過(guò)關(guān)的套件,基本上可以給任何具備 GNU 開(kāi)發(fā)環(huán)境的人去重新編譯成功。就 hello-1.tar.gz 這個(gè)范例而言,除了在Red Hat Linux 上,在 FreeBSD 2.2.x 也可以正確編譯。
要注意的是,利用 Autoconf 及 Automake 所產(chǎn)生出來(lái)的軟件套件是可以在沒(méi)有安裝 Autoconf 及 Automake 的環(huán)境使用的,因?yàn)?configure 是一個(gè) shell script,它己被設(shè)計(jì)為可以在一般 Unix 的 sh 這個(gè) shell 下執(zhí)行。但是如果要修改 configure.in 及 Makefile.am 文件再產(chǎn)生新的 configure 及 Makefile.in 文件時(shí)就一定要有 Autoconf 及 Automake 了。
5. 相關(guān)資料
Autoconf 和 Automake 功能十分強(qiáng)大,可以從它們附帶的 info 穩(wěn)當(dāng)4中找到詳細(xì)的使用方法說(shuō)明。你也可以從許多現(xiàn)有的GNU 軟件或 Open Source 軟件中找到相關(guān)的 configure.in 或 Makefile.am 文件,他們是學(xué)習(xí) Autoconf 及 Automake 更多技巧的最佳范例。
這個(gè)簡(jiǎn)介只用到了 Autoconf 及 Automake 的皮毛罷了,如果你有心加入 Open Source 軟件開(kāi)發(fā)的行列,希望這篇文章可以幫助你對(duì)產(chǎn)生 Makefile 有個(gè)簡(jiǎn)單的了解。其它有關(guān)開(kāi)發(fā) GNU 程式或 C 程序設(shè)計(jì)及 Makefile 的詳細(xì)運(yùn)用及技巧,建議從 GNU Coding Standards (GNU 編碼規(guī)定) 讀起,里面包含了 GNU Makefile 慣例,及開(kāi)發(fā) GNU 軟件的標(biāo)準(zhǔn)程序和慣例。這些 GNU 軟件的在線說(shuō)明文件可以在 http://www.gnu.org/ 上找到。
6. 結(jié)束語(yǔ)
利用 Autoconf 及 Automake,產(chǎn)生一個(gè) Makefile 似乎不再象以前那么困難了,而使用 Autoconf 也使得我們?cè)诓煌脚_(tái)上或各家 Unix 之間發(fā)布及便宜程序變的簡(jiǎn)單,這對(duì)于在Unix 系統(tǒng)上程序開(kāi)發(fā)員來(lái)說(shuō)減輕了許多負(fù)擔(dān)。妥善運(yùn)用這些 GNU 的工具軟件,可以幫助我們更容易的去開(kāi)發(fā)程序,而且更容易維護(hù)源代碼。


T.S Liu 2008-06-25 11:18 發(fā)表評(píng)論
]]>
vim參考手冊(cè)!http://www.shnenglu.com/liu1061/articles/54535.htmlT.S LiuT.S LiuWed, 25 Jun 2008 01:57:00 GMThttp://www.shnenglu.com/liu1061/articles/54535.htmlhttp://www.shnenglu.com/liu1061/comments/54535.htmlhttp://www.shnenglu.com/liu1061/articles/54535.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/54535.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/54535.htmlvim參考手冊(cè)

T.S Liu 2008-06-25 09:57 發(fā)表評(píng)論
]]>
Linux平臺(tái)可以用gdb進(jìn)行反匯編和調(diào)試。http://www.shnenglu.com/liu1061/articles/53762.htmlT.S LiuT.S LiuTue, 17 Jun 2008 13:16:00 GMThttp://www.shnenglu.com/liu1061/articles/53762.htmlhttp://www.shnenglu.com/liu1061/comments/53762.htmlhttp://www.shnenglu.com/liu1061/articles/53762.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/53762.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/53762.html
2. 最簡(jiǎn)C代碼分析

    為簡(jiǎn)化問(wèn)題,來(lái)分析一下最簡(jiǎn)的c代碼生成的匯編代碼:
    # vi test1.c
     
    int main()
    {
        return 0;
    }  
   
    編譯該程序,產(chǎn)生二進(jìn)制文件:
    # gcc test1.c -o test1
    # file test1  
    test1: ELF 32-bit LSB executable 80386 Version 1, dynamically linked, not stripped

    test1是一個(gè)ELF格式32位小端(Little Endian)的可執(zhí)行文件,動(dòng)態(tài)鏈接并且符號(hào)表沒(méi)有去除。
    這正是Unix/Linux平臺(tái)典型的可執(zhí)行文件格式。
    用mdb反匯編可以觀察生成的匯編代碼:

    # mdb test1
    Loading modules: [ libc.so.1 ]
    > main::dis                       ; 反匯編main函數(shù),mdb的命令一般格式為  <地址>::dis
    main:          pushl   %ebp       ; ebp寄存器內(nèi)容壓棧,即保存main函數(shù)的上級(jí)調(diào)用函數(shù)的棧基地址
    main+1:        movl    %esp,%ebp  ; esp值賦給ebp,設(shè)置main函數(shù)的棧基址
    main+3:          subl    $8,%esp
    main+6:          andl    $0xf0,%esp
    main+9:          movl    $0,%eax
    main+0xe:        subl    %eax,%esp
    main+0x10:     movl    $0,%eax    ; 設(shè)置函數(shù)返回值0
    main+0x15:     leave              ; 將ebp值賦給esp,pop先前棧內(nèi)的上級(jí)函數(shù)棧的基地址給ebp,恢復(fù)原棧基址
    main+0x16:     ret                ; main函數(shù)返回,回到上級(jí)調(diào)用
    >

    注:這里得到的匯編語(yǔ)言語(yǔ)法格式與Intel的手冊(cè)有很大不同,Unix/Linux采用AT&T匯編格式作為匯編語(yǔ)言的語(yǔ)法格式
         如果想了解AT&T匯編可以參考文章:Linux AT&T 匯編語(yǔ)言開(kāi)發(fā)指南

    問(wèn)題:誰(shuí)調(diào)用了 main函數(shù)?
    
     在C語(yǔ)言的層面來(lái)看,main函數(shù)是一個(gè)程序的起始入口點(diǎn),而實(shí)際上,ELF可執(zhí)行文件的入口點(diǎn)并不是main而是_start。
     mdb也可以反匯編_start:
      
    > _start::dis                       ;從_start 的地址開(kāi)始反匯編
    _start:              pushl   $0
    _start+2:            pushl   $0
    _start+4:            movl    %esp,%ebp
    _start+6:            pushl   %edx
    _start+7:            movl    $0x80504b0,%eax
    _start+0xc:          testl   %eax,%eax
    _start+0xe:          je      +0xf            <_start+0x1d>
    _start+0x10:         pushl   $0x80504b0
    _start+0x15:         call    -0x75           <atexit>
    _start+0x1a:         addl    $4,%esp
    _start+0x1d:         movl    $0x8060710,%eax
    _start+0x22:         testl   %eax,%eax
    _start+0x24:         je      +7              <_start+0x2b>
    _start+0x26:         call    -0x86           <atexit>
    _start+0x2b:         pushl   $0x80506cd
    _start+0x30:         call    -0x90           <atexit>
    _start+0x35:         movl    +8(%ebp),%eax
    _start+0x38:         leal    +0x10(%ebp,%eax,4),%edx
    _start+0x3c:         movl    %edx,0x8060804
    _start+0x42:         andl    $0xf0,%esp
    _start+0x45:         subl    $4,%esp
    _start+0x48:         pushl   %edx
    _start+0x49:         leal    +0xc(%ebp),%edx
    _start+0x4c:         pushl   %edx
    _start+0x4d:         pushl   %eax
    _start+0x4e:         call    +0x152          <_init>
    _start+0x53:         call    -0xa3           <__fpstart>
    _start+0x58:        call    +0xfb        <main>              ;在這里調(diào)用了main函數(shù)
    _start+0x5d:         addl    $0xc,%esp
    _start+0x60:         pushl   %eax
    _start+0x61:         call    -0xa1           <exit>
    _start+0x66:         pushl   $0
    _start+0x68:         movl    $1,%eax
    _start+0x6d:         lcall   $7,$0
    _start+0x74:         hlt
    >

    問(wèn)題:為什么用EAX寄存器保存函數(shù)返回值?
    實(shí)際上IA32并沒(méi)有規(guī)定用哪個(gè)寄存器來(lái)保存返回值。但如果反匯編Solaris/Linux的二進(jìn)制文件,就會(huì)發(fā)現(xiàn),都用EAX保存函數(shù)返回值。
    這不是偶然現(xiàn)象,是操作系統(tǒng)的ABI(Application Binary Interface)來(lái)決定的。
    Solaris/Linux操作系統(tǒng)的ABI就是Sytem V ABI。


    概念:SFP (Stack Frame Pointer) 棧框架指針 

    正確理解SFP必須了解:
        IA32 的棧的概念
        CPU 中32位寄存器ESP/EBP的作用
        PUSH/POP 指令是如何影響棧的
        CALL/RET/LEAVE 等指令是如何影響棧的

    如我們所知:
    1)IA32的棧是用來(lái)存放臨時(shí)數(shù)據(jù),而且是LIFO,即后進(jìn)先出的。棧的增長(zhǎng)方向是從高地址向低地址增長(zhǎng),按字節(jié)為單位編址。
    2) EBP是棧基址的指針,永遠(yuǎn)指向棧底(高地址),ESP是棧指針,永遠(yuǎn)指向棧頂(低地址)。
    3) PUSH一個(gè)long型數(shù)據(jù)時(shí),以字節(jié)為單位將數(shù)據(jù)壓入棧,從高到低按字節(jié)依次將數(shù)據(jù)存入ESP-1、ESP-2、ESP-3、ESP-4的地址單元。
    4) POP一個(gè)long型數(shù)據(jù),過(guò)程與PUSH相反,依次將ESP-4、ESP-3、ESP-2、ESP-1從棧內(nèi)彈出,放入一個(gè)32位寄存器。
    5) CALL指令用來(lái)調(diào)用一個(gè)函數(shù)或過(guò)程,此時(shí),下一條指令地址會(huì)被壓入堆棧,以備返回時(shí)能恢復(fù)執(zhí)行下條指令。
    6) RET指令用來(lái)從一個(gè)函數(shù)或過(guò)程返回,之前CALL保存的下條指令地址會(huì)從棧內(nèi)彈出到EIP寄存器中,程序轉(zhuǎn)到CALL之前下條指令處執(zhí)行
    7) ENTER是建立當(dāng)前函數(shù)的棧框架,即相當(dāng)于以下兩條指令:
        pushl   %ebp
        movl    %esp,%ebp
    8) LEAVE是釋放當(dāng)前函數(shù)或者過(guò)程的棧框架,即相當(dāng)于以下兩條指令:
        movl ebp esp
        popl  ebp

    如果反匯編一個(gè)函數(shù),很多時(shí)候會(huì)在函數(shù)進(jìn)入和返回處,發(fā)現(xiàn)有類(lèi)似如下形式的匯編語(yǔ)句:
       
        pushl   %ebp            ; ebp寄存器內(nèi)容壓棧,即保存main函數(shù)的上級(jí)調(diào)用函數(shù)的棧基地址
        movl    %esp,%ebp       ; esp值賦給ebp,設(shè)置 main函數(shù)的棧基址
        ...........             ; 以上兩條指令相當(dāng)于 enter 0,0
        ...........
        leave                   ; 將ebp值賦給esp,pop先前棧內(nèi)的上級(jí)函數(shù)棧的基地址給ebp,恢復(fù)原棧基址
        ret                     ; main函數(shù)返回,回到上級(jí)調(diào)用

    這些語(yǔ)句就是用來(lái)創(chuàng)建和釋放一個(gè)函數(shù)或者過(guò)程的棧框架的。
    原來(lái)編譯器會(huì)自動(dòng)在函數(shù)入口和出口處插入創(chuàng)建和釋放棧框架的語(yǔ)句。
    函數(shù)被調(diào)用時(shí):
    1) EIP/EBP成為新函數(shù)棧的邊界
    函數(shù)被調(diào)用時(shí),返回時(shí)的EIP首先被壓入堆棧;創(chuàng)建棧框架時(shí),上級(jí)函數(shù)棧的EBP被壓入堆棧,與EIP一道行成新函數(shù)棧框架的邊界
    2) EBP成為棧框架指針SFP,用來(lái)指示新函數(shù)棧的邊界
    棧框架建立后,EBP指向的棧的內(nèi)容就是上一級(jí)函數(shù)棧的EBP,可以想象,通過(guò)EBP就可以把層層調(diào)用函數(shù)的棧都回朔遍歷一遍,調(diào)試器就是利用這個(gè)特性實(shí)現(xiàn) backtrace功能的
    3) ESP總是作為棧指針指向棧頂,用來(lái)分配棧空間
    棧分配空間給函數(shù)局部變量時(shí)的語(yǔ)句通常就是給ESP減去一個(gè)常數(shù)值,例如,分配一個(gè)整型數(shù)據(jù)就是 ESP-4
    4) 函數(shù)的參數(shù)傳遞和局部變量訪問(wèn)可以通過(guò)SFP即EBP來(lái)實(shí)現(xiàn)
    由于棧框架指針永遠(yuǎn)指向當(dāng)前函數(shù)的棧基地址,參數(shù)和局部變量訪問(wèn)通常為如下形式:
        +8+xx(%ebp)         ; 函數(shù)入口參數(shù)的的訪問(wèn)
        -xx(%ebp)           ; 函數(shù)局部變量訪問(wèn)
           
    假如函數(shù)A調(diào)用函數(shù)B,函數(shù)B調(diào)用函數(shù)C ,則函數(shù)棧框架及調(diào)用關(guān)系如下圖所示:
   	+-------------------------+----> 高地址
| EIP (上級(jí)函數(shù)返回地址) |
+-------------------------+
+--> | EBP (上級(jí)函數(shù)的EBP) | --+ <------當(dāng)前函數(shù)A的EBP (即SFP框架指針)
| +-------------------------+ +-->偏移量A
| | Local Variables | |
| | .......... | --+ <------ESP指向函數(shù)A新分配的局部變量,局部變量可以通過(guò)A的ebp-偏移量A訪問(wèn)
| f +-------------------------+
| r | Arg n(函數(shù)B的第n個(gè)參數(shù)) |
| a +-------------------------+
| m | Arg .(函數(shù)B的第.個(gè)參數(shù)) |
| e +-------------------------+
| | Arg 1(函數(shù)B的第1個(gè)參數(shù)) |
| o +-------------------------+
| f | Arg 0(函數(shù)B的第0個(gè)參數(shù)) | --+ <------ B函數(shù)的參數(shù)可以由B的ebp+偏移量B訪問(wèn)
| +-------------------------+ +--> 偏移量B
| A | EIP (A函數(shù)的返回地址) | |
| +-------------------------+ --+
+--- | EBP (A函數(shù)的EBP) |<--+ <------ 當(dāng)前函數(shù)B的EBP (即SFP框架指針)
+-------------------------+ |
| Local Variables | |
| .......... | | <------ ESP指向函數(shù)B新分配的局部變量
+-------------------------+ |
| Arg n(函數(shù)C的第n個(gè)參數(shù)) | |
+-------------------------+ |
| Arg .(函數(shù)C的第.個(gè)參數(shù)) | |
+-------------------------+ +--> frame of B
| Arg 1(函數(shù)C的第1個(gè)參數(shù)) | |
+-------------------------+ |
| Arg 0(函數(shù)C的第0個(gè)參數(shù)) | |
+-------------------------+ |
| EIP (B函數(shù)的返回地址) | |
+-------------------------+ |
+--> | EBP (B函數(shù)的EBP) | --+ <------ 當(dāng)前函數(shù)C的EBP (即SFP框架指針)
| +-------------------------+
| | Local Variables |
| | .......... | <------ ESP指向函數(shù)C新分配的局部變量
| +-------------------------+----> 低地址
frame of C

圖 1-1
      
    再分析test1反匯編結(jié)果中剩余部分語(yǔ)句的含義:
       
    # mdb test1
    Loading modules: [ libc.so.1 ]
    > main::dis                        ; 反匯編main函數(shù)
    main:          pushl   %ebp                           
    main+1:        movl    %esp,%ebp        ; 創(chuàng)建Stack Frame(棧框架)
    main+3:       subl    $8,%esp       ; 通過(guò)ESP-8來(lái)分配8字節(jié)堆棧空間
    main+6:       andl    $0xf0,%esp    ; 使棧地址16字節(jié)對(duì)齊
    main+9:       movl    $0,%eax       ; 無(wú)意義
    main+0xe:     subl    %eax,%esp     ; 無(wú)意義
    main+0x10:     movl    $0,%eax          ; 設(shè)置main函數(shù)返回值
    main+0x15:     leave                    ; 撤銷(xiāo)Stack Frame(棧框架)
    main+0x16:     ret                      ; main 函數(shù)返回
    >

    以下兩句似乎是沒(méi)有意義的,果真是這樣嗎?
        movl    $0,%eax
        subl     %eax,%esp
      
    用gcc的O2級(jí)優(yōu)化來(lái)重新編譯test1.c:
    # gcc -O2 test1.c -o test1
    # mdb test1
    > main::dis
    main:         pushl   %ebp
    main+1:       movl    %esp,%ebp
    main+3:       subl    $8,%esp
    main+6:       andl    $0xf0,%esp
    main+9:       xorl    %eax,%eax      ; 設(shè)置main返回值,使用xorl異或指令來(lái)使eax為0
    main+0xb:     leave
    main+0xc:     ret
    >
    新的反匯編結(jié)果比最初的結(jié)果要簡(jiǎn)潔一些,果然之前被認(rèn)為無(wú)用的語(yǔ)句被優(yōu)化掉了,進(jìn)一步驗(yàn)證了之前的猜測(cè)。
    提示:編譯器產(chǎn)生的某些語(yǔ)句可能在程序?qū)嶋H語(yǔ)義上沒(méi)有用處,可以用優(yōu)化選項(xiàng)去掉這些語(yǔ)句。

    問(wèn)題:為什么用xorl來(lái)設(shè)置eax的值?
    注意到優(yōu)化后的代碼中,eax返回值的設(shè)置由 movl $0,%eax 變?yōu)?xorl %eax,%eax ,這是因?yàn)镮A32指令中,xorl比movl有更高的運(yùn)行速度。

    概念:Stack aligned 棧對(duì)齊
    那么,以下語(yǔ)句到底是和作用呢?
        subl    $8,%esp
       andl    $0xf0,%esp     ; 通過(guò)andl使低4位為0,保證棧地址16字節(jié)對(duì)齊
      
    表面來(lái)看,這條語(yǔ)句最直接的后果是使ESP的地址后4位為0,即16字節(jié)對(duì)齊,那么為什么這么做呢?
    原來(lái),IA32 系列CPU的一些指令分別在4、8、16字節(jié)對(duì)齊時(shí)會(huì)有更快的運(yùn)行速度,因此gcc編譯器為提高生成代碼在IA32上的運(yùn)行速度,默認(rèn)對(duì)產(chǎn)生的代碼進(jìn)行16字節(jié)對(duì)齊

        andl $0xf0,%esp 的意義很明顯,那么 subl $8,%esp 呢,是必須的嗎?
    這里假設(shè)在進(jìn)入main函數(shù)之前,棧是16字節(jié)對(duì)齊的話,那么,進(jìn)入main函數(shù)后,EIP和EBP被壓入堆棧后,棧地址最末4位二進(jìn)制位必定是1000,esp -8則恰好使后4位地址二進(jìn)制位為0000。看來(lái),這也是為保證棧16字節(jié)對(duì)齊的。

    如果查一下gcc的手冊(cè),就會(huì)發(fā)現(xiàn)關(guān)于棧對(duì)齊的參數(shù)設(shè)置:
    -mpreferred-stack-boundary=n    ; 希望棧按照2的n次的字節(jié)邊界對(duì)齊, n的取值范圍是2-12

    默認(rèn)情況下,n是等于4的,也就是說(shuō),默認(rèn)情況下,gcc是16字節(jié)對(duì)齊,以適應(yīng)IA32大多數(shù)指令的要求。

    讓我們利用-mpreferred-stack-boundary=2來(lái)去除棧對(duì)齊指令:
     
    # gcc -mpreferred-stack-boundary=2 test1.c -o test1
      
    > main::dis
    main:       pushl   %ebp
    main+1:     movl    %esp,%ebp
    main+3:     movl    $0,%eax
    main+8:     leave
    main+9:     ret
    >

    可以看到,棧對(duì)齊指令沒(méi)有了,因?yàn)椋琁A32的棧本身就是4字節(jié)對(duì)齊的,不需要用額外指令進(jìn)行對(duì)齊。
    那么,棧框架指針SFP是不是必須的呢?
    # gcc -mpreferred-stack-boundary=2 -fomit-frame-pointer test1.c -o test
    > main::dis
    main:       movl    $0,%eax
    main+5:     ret
    >

    由此可知,-fomit-frame-pointer 可以去除SFP。
      
    問(wèn)題:去除SFP后有什么缺點(diǎn)呢?
      
    1)增加調(diào)式難度
        由于SFP在調(diào)試器backtrace的指令中被使用到,因此沒(méi)有SFP該調(diào)試指令就無(wú)法使用。
    2)降低匯編代碼可讀性
        函數(shù)參數(shù)和局部變量的訪問(wèn),在沒(méi)有ebp的情況下,都只能通過(guò)+xx(esp)的方式訪問(wèn),而很難區(qū)分兩種方式,降低了程序的可讀性。
      
    問(wèn)題:去除SFP有什么優(yōu)點(diǎn)呢?
      
    1)節(jié)省棧空間
    2)減少建立和撤銷(xiāo)棧框架的指令后,簡(jiǎn)化了代碼
    3)使ebp空閑出來(lái),使之作為通用寄存器使用,增加通用寄存器的數(shù)量
    4)以上3點(diǎn)使得程序運(yùn)行速度更快

    概念:Calling Convention  調(diào)用約定和 ABI (Application Binary Interface) 應(yīng)用程序二進(jìn)制接口
        
        函數(shù)如何找到它的參數(shù)?
        函數(shù)如何返回結(jié)果?
        函數(shù)在哪里存放局部變量?
        那一個(gè)硬件寄存器是起始空間?
        那一個(gè)硬件寄存器必須預(yù)先保留?

    Calling Convention  調(diào)用約定對(duì)以上問(wèn)題作出了規(guī)定。Calling Convention也是ABI的一部分。
    因此,遵守相同ABI規(guī)范的操作系統(tǒng),使其相互間實(shí)現(xiàn)二進(jìn)制代碼的互操作成為了可能。
    例如:由于Solaris、Linux都遵守System V的ABI,Solaris 10就提供了直接運(yùn)行Linux二進(jìn)制程序的功能。
    詳見(jiàn)文章:
關(guān)注: Solaris 10的10大新變化
            
3. 小結(jié)
    本文通過(guò)最簡(jiǎn)的C程序,引入以下概念:
        SFP 棧框架指針
        Stack aligned 棧對(duì)齊
        Calling Convention  調(diào)用約定 和 ABI (Application Binary Interface) 應(yīng)用程序二進(jìn)制接口
    今后,將通過(guò)進(jìn)一步的實(shí)驗(yàn),來(lái)深入了解這些概念。通過(guò)掌握這些概念,使在匯編級(jí)調(diào)試程序產(chǎn)生的core dump、掌握C語(yǔ)言高級(jí)調(diào)試技巧成為了可能。


T.S Liu 2008-06-17 21:16 發(fā)表評(píng)論
]]>
Linux 匯編語(yǔ)言開(kāi)發(fā)指南http://www.shnenglu.com/liu1061/articles/53761.htmlT.S LiuT.S LiuTue, 17 Jun 2008 13:11:00 GMThttp://www.shnenglu.com/liu1061/articles/53761.htmlhttp://www.shnenglu.com/liu1061/comments/53761.htmlhttp://www.shnenglu.com/liu1061/articles/53761.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/53761.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/53761.html閱讀全文

T.S Liu 2008-06-17 21:11 發(fā)表評(píng)論
]]>
gdb 方法 說(shuō)明 (轉(zhuǎn))http://www.shnenglu.com/liu1061/articles/53249.htmlT.S LiuT.S LiuSat, 14 Jun 2008 08:02:00 GMThttp://www.shnenglu.com/liu1061/articles/53249.htmlhttp://www.shnenglu.com/liu1061/comments/53249.htmlhttp://www.shnenglu.com/liu1061/articles/53249.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/53249.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/53249.html* list:顯示程序中的代碼,常用使用格式有:

    list

      輸出從上次調(diào)用list命令開(kāi)始往后的10行程序代碼。

    list -

      輸出從上次調(diào)用list命令開(kāi)始往前的10行程序代碼。

    list n

      輸出第n行附近的10行程序代碼。

    list function

      輸出函數(shù)function前后的10行程序代碼。

 * forward/search:從當(dāng)前行向后查找匹配某個(gè)字符串的程序行。使用格式:

    forward/search 字符串

  查找到的行號(hào)將保存在$_變量中,可以用print $_命令來(lái)查看。

 * reverse-search:和forward/search相反,向前查找字符串。使用格式同上。

 * break:在程序中設(shè)置斷點(diǎn),當(dāng)程序運(yùn)行到指定行上時(shí),會(huì)暫停執(zhí)行。使用格式:

    break 要設(shè)置斷點(diǎn)的行號(hào)

 * tbreak:設(shè)置臨時(shí)斷點(diǎn),在設(shè)置之后只起作用一次。使用格式:

    tbreak 要設(shè)置臨時(shí)斷點(diǎn)的行號(hào)

 * clear:和break相反,clear用于清除斷點(diǎn)。使用格式:

    clear 要清除的斷點(diǎn)所在的行號(hào)

 * run:?jiǎn)?dòng)程序,在run后面帶上參數(shù)可以傳遞給正在調(diào)試的程序。

 * awatch:用來(lái)增加一個(gè)觀察點(diǎn)(add watch),使用格式:

    awatch 變量或表達(dá)式

  當(dāng)表達(dá)式的值發(fā)生改變或表達(dá)式的值被讀取時(shí),程序就會(huì)停止運(yùn)行。

 * watch:與awatch類(lèi)似用來(lái)設(shè)置觀察點(diǎn),但程序只有當(dāng)表達(dá)式的值發(fā)生改變時(shí)才會(huì)停止運(yùn)行。使用格 式:

    watch 變量或表達(dá)式

  需要注意的是,awatch和watch都必須在程序運(yùn)行的過(guò)程中設(shè)置觀察點(diǎn),即可運(yùn)行run之后才能設(shè)置。

 * commands:設(shè)置在遇到斷點(diǎn)后執(zhí)行特定的指令。使用格式有:

    commands

      設(shè)置遇到最后一個(gè)遇到的斷點(diǎn)時(shí)要執(zhí)行的命令

    commands n

      設(shè)置遇到斷點(diǎn)號(hào)n時(shí)要執(zhí)行的命令

  注意,commands后面跟的是斷點(diǎn)號(hào),而不是斷點(diǎn)所在的行號(hào)。

  在輸入命令后,就可以輸入遇到斷點(diǎn)后要執(zhí)行的命令,每行一條命令,在輸入最后一條命令后輸入end就可以結(jié)束輸入。

 * delete:清除斷點(diǎn)或自動(dòng)顯示的表達(dá)式。使用格式:

    delete 斷點(diǎn)號(hào)

 * disable:讓指定斷點(diǎn)失效。使用格式:

    disable 斷點(diǎn)號(hào)列表

  斷點(diǎn)號(hào)之間用空格間隔開(kāi)。

 * enable:和disable相反,恢復(fù)失效的斷點(diǎn)。使用格式:

    enable 斷點(diǎn)編號(hào)列表

 * ignore:忽略斷點(diǎn)。使用格式:

    ignore 斷點(diǎn)號(hào) 忽略次數(shù)

 * condition:設(shè)置斷點(diǎn)在一定條件下才能生效。使用格式:

    condition 斷點(diǎn)號(hào) 條件表達(dá)式

 * cont/continue:使程序在暫停在斷點(diǎn)之后繼續(xù)運(yùn)行。使用格式:

    cont

      跳過(guò)當(dāng)前斷點(diǎn)繼續(xù)運(yùn)行。

    cont n

      跳過(guò)n次斷點(diǎn),繼續(xù)運(yùn)行。

  當(dāng)n為1時(shí),cont 1即為cont。

 * jump:讓程序跳到指定行開(kāi)始調(diào)試。使用格式:

    jump 行號(hào)

 * next:繼續(xù)執(zhí)行語(yǔ)句,但是跳過(guò)子程序的調(diào)用。使用格式:

    next

      執(zhí)行一條語(yǔ)句

    next n

      執(zhí)行n條語(yǔ)句

 * nexti:?jiǎn)尾綀?zhí)行語(yǔ)句,但和next不同的是,它會(huì)跟蹤到子程序的內(nèi)部,但不打印出子程序內(nèi)部的語(yǔ)句。使用格式同上。

 * step:與next類(lèi)似,但是它會(huì)跟蹤到子程序的內(nèi)部,而且會(huì)顯示子程序內(nèi)部的執(zhí)行情況。使用格式同上。

 * stepi:與step類(lèi)似,但是比step更詳細(xì),是nexti和step的結(jié)合。使用格式同上。

 * whatis:顯示某個(gè)變量或表達(dá)式的數(shù)據(jù)類(lèi)型。使用格式:

    whatis 變量或表達(dá)式

 * ptype:和whatis類(lèi)似,用于顯示數(shù)據(jù)類(lèi)型,但是它還可以顯示typedef定義的類(lèi)型等。使用格式:

    ptype 變量或表達(dá)式

 * set:設(shè)置程序中變量的值。使用格式:

    set 變量=表達(dá)式

    set 變量:=表達(dá)式

 * display:增加要顯示值的表達(dá)式。使用格式:

    display 表達(dá)式

 * info display:顯示當(dāng)前所有的要顯示值的表達(dá)式。

 * delete display/undisplay:刪除要顯示值的表達(dá)式。使用格式:

    delete display/undisplay 表達(dá)式編號(hào)

 * disable display:暫時(shí)不顯示一個(gè)要表達(dá)式的值。使用格式:

    disable display 表達(dá)式編號(hào)

 * enable display:與disable display相反,使用表達(dá)式恢復(fù)顯示。使用格式:

    enable display 表達(dá)式編號(hào)

 * print:打印變量或表達(dá)式的值。使用格式:

    print 變量或表達(dá)式

  表達(dá)式中有兩個(gè)符號(hào)有特殊含義:$和$$。

  $表示給定序號(hào)的前一個(gè)序號(hào),$$表示給定序號(hào)的前兩個(gè)序號(hào)。

  如果$和$$后面不帶數(shù)字,則給定序號(hào)為當(dāng)前序號(hào)。

 * backtrace:打印指定個(gè)數(shù)的棧幀(stack frame)。使用格式:

    backtrace 棧幀個(gè)數(shù)

 * frame:打印棧幀。使用格式:

    frame 棧幀號(hào)

 * info frame:顯示當(dāng)前棧幀的詳細(xì)信息。

 * select-frame:選擇棧幀,選擇后可以用info frame來(lái)顯示棧幀信息。使用格式:

    select-frame 棧幀號(hào)

 * kill:結(jié)束當(dāng)前程序的調(diào)試。

 * quit:退出gdb。



T.S Liu 2008-06-14 16:02 發(fā)表評(píng)論
]]>
gdb command! (轉(zhuǎn))http://www.shnenglu.com/liu1061/articles/53232.htmlT.S LiuT.S LiuSat, 14 Jun 2008 05:37:00 GMThttp://www.shnenglu.com/liu1061/articles/53232.htmlhttp://www.shnenglu.com/liu1061/comments/53232.htmlhttp://www.shnenglu.com/liu1061/articles/53232.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/53232.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/53232.html一個(gè)調(diào)試器,能讓你觀察到正在運(yùn)行的程序的某個(gè)變量的值,和gcc, emacs組成構(gòu)建起整個(gè)gnu system的3劍客。

2.How it work?
首先要安裝,然后就可以 gdb application,進(jìn)入gdb模式,執(zhí)行(run)啟動(dòng)例程。(list-顯示源碼)

3.一個(gè)優(yōu)點(diǎn)
GDB的函數(shù)調(diào)用是緩式的,也就是說(shuō)只有當(dāng)變量真正需要時(shí)才會(huì)被計(jì)算。
int c = add(1,1)
printf("%d",c);

gdb-->run-->print c -1222342. c的值直到打印的時(shí)候才會(huì)被計(jì)算。(這里可能有個(gè)開(kāi)關(guān)來(lái)控制緩式計(jì)算)

4.一個(gè)前提
gcc 的時(shí)候加上 -g 或者 -ggdb,主要是生成供調(diào)試使用的某些信息。(emacs好像默認(rèn)是關(guān)閉這個(gè)選項(xiàng))

5.存在圖形調(diào)試界面

6.輸入help可以查看幫助
help,會(huì)顯示命令的分類(lèi),help 類(lèi)名

7.how use?
debug 3 program yourself.

8.常用命令(From:http://my.donews.com/tangfl/2006/10/23/gdb-debug-example/)
  break NUM 在指定的行上設(shè)置斷點(diǎn)。
  bt 顯示所有的調(diào)用棧幀。該命令可用來(lái)顯示函數(shù)的調(diào)用順序。
  clear 刪除設(shè)置在特定源文件、特定行上的斷點(diǎn)。其用法為clear FILENAME:NUM
  continue 繼續(xù)執(zhí)行正在調(diào)試的程序。該命令用在程序由于處理信號(hào)或斷點(diǎn)而 導(dǎo)致停止運(yùn)行時(shí)。
  display EXPR 每次程序停止后顯示表達(dá)式的值。表達(dá)式由程序定義的變量組成。
  file FILE 裝載指定的可執(zhí)行文件進(jìn)行調(diào)試。
  help NAME 顯示指定命令的幫助信息。
  info break 顯示當(dāng)前斷點(diǎn)清單,包括到達(dá)斷點(diǎn)處的次數(shù)等。
  info files 顯示被調(diào)試文件的詳細(xì)信息。
  info func 顯示所有的函數(shù)名稱(chēng)。
  info local 顯示當(dāng)函數(shù)中的局部變量信息。
  info prog 顯示被調(diào)試程序的執(zhí)行狀態(tài)。
  info var 顯示所有的全局和靜態(tài)變量名稱(chēng)。
  kill 終止正被調(diào)試的程序。
  list 顯示源代碼段。
  make 在不退出 gdb 的情況下運(yùn)行 make 工具。
  next 在不單步執(zhí)行進(jìn)入其他函數(shù)的情況下,向前執(zhí)行一行源代碼。
  print EXPR 顯示表達(dá)式 EXPR 的值。
backtrace 顯示程序中的當(dāng)前位置和表示如何到達(dá)當(dāng)前位置的棧跟蹤(同義詞:where)
breakpoint 在程序中設(shè)置一個(gè)斷點(diǎn)
cd 改變當(dāng)前工作目錄
clear 刪除剛才停止處的斷點(diǎn)
commands 命中斷點(diǎn)時(shí),列出將要執(zhí)行的命令
continue 從斷點(diǎn)開(kāi)始繼續(xù)執(zhí)行
delete 刪除一個(gè)斷點(diǎn)或監(jiān)測(cè)點(diǎn);也可與其他命令一起使用
display 程序停止時(shí)顯示變量和表達(dá)時(shí)
down 下移棧幀,使得另一個(gè)函數(shù)成為當(dāng)前函數(shù)
frame 選擇下一條continue命令的幀
info 顯示與該程序有關(guān)的各種信息
jump 在源程序中的另一點(diǎn)開(kāi)始運(yùn)行
kill 異常終止在gdb 控制下運(yùn)行的程序
list 列出相應(yīng)于正在執(zhí)行的程序的原文件內(nèi)容
next 執(zhí)行下一個(gè)源程序行,從而執(zhí)行其整體中的一個(gè)函數(shù)
print 顯示變量或表達(dá)式的值
pwd 顯示當(dāng)前工作目錄
pype 顯示一個(gè)數(shù)據(jù)結(jié)構(gòu)(如一個(gè)結(jié)構(gòu)或C++類(lèi))的內(nèi)容
quit 退出gdb
reverse-search 在源文件中反向搜索正規(guī)表達(dá)式
run 執(zhí)行該程序
search 在源文件中搜索正規(guī)表達(dá)式
set variable 給變量賦值
signal 將一個(gè)信號(hào)發(fā)送到正在運(yùn)行的進(jìn)程
step 執(zhí)行下一個(gè)源程序行,必要時(shí)進(jìn)入下一個(gè)函數(shù)
undisplay display命令的反命令,不要顯示表達(dá)式
until 結(jié)束當(dāng)前循環(huán)
up 上移棧幀,使另一函數(shù)成為當(dāng)前函數(shù)
watch 在程序中設(shè)置一個(gè)監(jiān)測(cè)點(diǎn)(即數(shù)據(jù)斷點(diǎn))
whatis 顯示變量或函數(shù)類(lèi)型

T.S Liu 2008-06-14 13:37 發(fā)表評(píng)論
]]>
ubuntu linux base comandhttp://www.shnenglu.com/liu1061/articles/52223.htmlT.S LiuT.S LiuThu, 05 Jun 2008 02:14:00 GMThttp://www.shnenglu.com/liu1061/articles/52223.htmlhttp://www.shnenglu.com/liu1061/comments/52223.htmlhttp://www.shnenglu.com/liu1061/articles/52223.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/52223.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/52223.htmlNO   分類(lèi)   PS1   命令名   用法及參數(shù)   功能注解         
1  文件管理   #   ls   ls -a   列出當(dāng)前目錄下的所有文件,包括以.頭的隱含文件          
   文件管理   #   ls   ls -l或ll   列出當(dāng)前目錄下文件的詳細(xì)信息          
   文件管理   #   pwd   pwd   查看當(dāng)前所在目錄的絕對(duì)路經(jīng)          
   文件管理   #   cd   cd ..   回當(dāng)前目錄的上一級(jí)目錄          
   文件管理   #   cd   cd -   回上一次所在的目錄          
   文件管理   #   cd   cd ~ 或 cd   回當(dāng)前用戶的宿主目錄          
   文件管理   #   cd   cd ~用戶名   回指定用戶的宿主目錄         
2  文件管理   #   mkdir   mkdir 目錄名   創(chuàng)建一個(gè)目錄          
   文件管理   #   mkdir   mkdir –p   遞歸式去創(chuàng)建一些嵌套目錄          
   文件管理   #   rmdir   Rmdir 空目錄名   刪除一個(gè)空目錄         
3  文件管理   #   rm   rm 文件名 文件名   刪除一個(gè)文件或多個(gè)文件          
   文件管理   #   rm   rm -rf 非空目錄名   遞歸刪除一個(gè)非空目錄下的一切,不讓提式-f         
4  文件管理   #   cat   cat文件名   一屏查看文件內(nèi)容         
5  文件管理   #   more   more文件名   分頁(yè)查看文件內(nèi)容         
6  文件管理   #   less   less 文件名   可控分頁(yè)查看文件內(nèi)容         
7  文件管理   #   grep   grep字符 文件名   根據(jù)字符匹配來(lái)查看文件部分內(nèi)容         
8  文件管理   #   mv   mv 路經(jīng)/文件  /經(jīng)/文件   移動(dòng)相對(duì)路經(jīng)下的文件到絕對(duì)路經(jīng)下          
   文件管理   #   mv   mv 文件名 新名稱(chēng)   在當(dāng)前目錄下改名         
9  文件管理   #   cp   cp /路經(jīng)/文件  ./   移動(dòng)絕對(duì)路經(jīng)下的文件到當(dāng)前目錄下         
10 文件管理   #   find   find 路經(jīng) -name “字符串”   查找路經(jīng)所在范圍內(nèi)滿足字符串匹配的文件和目錄         
11 文件管理   #   ln   ln 源文件 鏈接名   創(chuàng)建當(dāng)前目錄源文件的硬鏈接         
                  ln /home/test /usr/test1   在/usr下建立/home/test的硬鏈接         
12 文件管理   #   ln   Ln -s a b   創(chuàng)建當(dāng)前目錄下a的符號(hào)鏈接b      
13 文件管理   #   touch   touch file1 file2   創(chuàng)建兩個(gè)空文件         
14 磁盤(pán)管理   #   df   df   用于報(bào)告文件系統(tǒng)的總?cè)萘浚褂昧浚S嗳萘俊?nbsp;        
15 磁盤(pán)管理   #   du   du -b /home   查看目前/HOME目錄的容量(k)及子目錄的容量(k)。         
16 磁盤(pán)管理   #   fdisk   fdisk -l   查看系統(tǒng)分區(qū)信息      
17 磁盤(pán)管理   #   fdisk   fdisk /dev/sdb   為一塊新的SCSI硬盤(pán)進(jìn)行分區(qū)      
18 磁盤(pán)管理   #   mkfs.ext3   Mkfs.ext3 /dev/sdb1
                  為第一塊SCSI硬盤(pán)的第一主分區(qū)格式化成ext3的文件系統(tǒng)      
                  mkfs.ext2   Mkfs.ext2/dev/sdb2    格式化成ext2文件系統(tǒng)      
19 磁盤(pán)管理   #   mount   mount -t 文件系統(tǒng)類(lèi)型 設(shè)備路經(jīng)  訪問(wèn)路經(jīng)         
   磁盤(pán)管理   #   文件系統(tǒng)類(lèi)型            
                  Iso9660   光驅(qū)文件系統(tǒng)         
                  vfat   Fat文件系統(tǒng)(windows)         
   掛載光驅(qū)   #   mount –t iso9660 /dev/cdrom /mnt/cdrom           
   掛載FAT    #   mount –t vfat /dev/hda5 /mnt/cdrom    掛第一個(gè)ide的第五個(gè)邏輯分區(qū)      
17 磁盤(pán)管理   #   Umount /mnt/cdrom     卸載/mnt/cdrom為空      
18 文件權(quán)限   #   chmod   chmod u+s file   為file的屬主加上特殊權(quán)限         
                  chmod g+r file   為file的屬組加上讀權(quán)限         
                  chmod o+w file   為file的其它用戶加上寫(xiě)權(quán)限         
                  chmod a-x file   為file的所有用戶減去執(zhí)行權(quán)限      
                  chmod 765 file  為file的屬主設(shè)為完全權(quán)限,屬組設(shè)成讀寫(xiě)權(quán),其它用戶具有讀和執(zhí)心權(quán)限      
19   文件權(quán)限   #   chown   chown root /home   把/home的屬主改成root用戶      
20   文件權(quán)限   #   chgrp   chgrp root /home   把/home的屬組改成root組      
21   打印管理   #   redhat-config-printer-tui   進(jìn)入安裝打印機(jī)界面         
22   打印管理   #   lp   lp –d hptr file   打印file到hptr的打印機(jī)上         
23   打印管理   #   lpq   Lpq –P 打印機(jī)名   查看打印機(jī)的狀態(tài)         
24   打印管理   #   lprm   Lprm –P 打印機(jī)名 a   刪除打印機(jī)內(nèi)的打印作業(yè)         
25   打印管理   #   disable   Disable –r “changing paper” HPtr    禁用打印機(jī)并提示原因      
26   打印管理   #   enable   Enable HPtr   重新啟用被禁用的         
27   用戶管理   #   useradd   Useradd   創(chuàng)建一個(gè)新的用戶         
28   用戶管理   #   groupadd   Groupadd 組名   創(chuàng)建一個(gè)新的組         
29   用戶管理   #   passwd   Passwd 用戶名   為用戶創(chuàng)建密碼         
30   用戶管理   #   Passwd -d   Passwd -d用戶名   刪除用戶密碼也能登陸         
31   用戶管理   #   Passwd -l   Passwd -l用戶名   鎖定賬號(hào)密碼         
32   用戶管理   #   Passwd -u   Passwd -u用戶名   解鎖賬號(hào)密碼         
33   用戶管理   #   Passwd -S   Passwd -S用戶名   查詢(xún)賬號(hào)密碼         
34   用戶管理   #   Usermod -l   Usermod -l 新用戶名 老用戶名   為用戶改名         
35   用戶管理   #   Usermod -L   Usermod -L 要鎖定用戶名   鎖定用戶登陸         
36   用戶管理   #   Usermod -U   Usermod –U解鎖用戶名   解鎖用戶登陸         
37   用戶管理   #   Usermod -u   Usermod –u 501用戶名   改變用戶UID         
38   用戶管理   #   Userdel   Userdel–r 用戶名   刪除用戶一切         
39   用戶管理   #   Groupmod -n   Groupmod –n新用戶名 老用戶名   為組改名         
40   用戶管理   #   Groupmod -g   Groupmod –g 501 組名   改變組GID         
41   用戶管理   #   groupdel   Groupdel組名    先應(yīng)刪它的用戶   刪除組         
42   用戶管理   #   gpasswd -a   gpasswd -a 用戶名 組名   增加用戶到組         
43   用戶管理   #   Id    id   用戶名   查用戶信息         
44   軟件管理   #   rpm -qa   rpm –qa | less   查詢(xún)已安裝RPM         
45   軟件管理   #   rpm –qa | grep ftp   查詢(xún)指定RPM         
46   軟件管理   #   rpm -q   rpm -q 已安裝的RPM包   查是否安裝         
47   軟件管理   #   rpm -q telnet-server   查看telnet服務(wù)器包      
48   軟件管理   #   rpm -qi   rpm –qi 軟件包名稱(chēng)   查看軟件的描述信息      
49   軟件管理   #   rpm -ql   rpm –ql軟件包名稱(chēng)   查詢(xún)軟件包的文件列表      
50   軟件管理   #   rpm -qf   rpm –qf軟件包名稱(chēng)   查詢(xún)某個(gè)文件所屬的軟件包      
51   軟件管理   #   rpm -qp   rpm –qp軟件包全名   查詢(xún)未安裝的軟件包信息      
52   軟件管理   #   rpm -e   rpm –e 軟件包名稱(chēng)   刪除具體的軟件包      
53   軟件管理   #   rpm -U   rpm –Uvh軟件包全名   升級(jí)軟件包并顯示過(guò)程      
54   軟件管理   #   rpm -ivh   rpm –ivh 軟件包全名   安裝軟件包并顯示過(guò)程      
55   軟件管理   #   rpm -V   rpm –V軟件包名稱(chēng)   驗(yàn)證軟件包的大小,類(lèi)型等      
56   軟件管理   #   tar    -c 創(chuàng)建包 –x 釋放包  -v 顯示命令過(guò)程 –z 代表壓縮包      
57   軟件管理   #   tar -cf   tar –cvf benet.tar /home/benet   把/home/benet目錄打包      
58   軟件管理   #   tar -czf   tar –zcvf benet.tar.gz /mnt   把目錄打包并壓縮      
59   軟件管理   #   tar –tf   tar –tf benet.tar   看非壓縮包的文件列表      
60   軟件管理   #   tar –tzf   tar –tf benet.tar.gz   看壓縮包的文件列表      
61   軟件管理   #   tar –xf   tar –xf benet.tar   非壓縮包的文件恢復(fù)      
62   軟件管理   #   tar –zxvf   tar –zxvf benet.tar.gz   壓縮包的文件解壓恢復(fù)      
63   軟件管理   #   tar -jxvf   tar –jxvf benet.tar.bz2         
64   軟件管理   #   diff   diff file1 file2 > 補(bǔ)丁名.patch   為新舊文件生成補(bǔ)丁文件      
65   軟件管理   #   diff   diff file1 file2   比較兩個(gè)文件的區(qū)別      
66   軟件管理   #   Patch    Patch file補(bǔ)丁名.patch   打補(bǔ)丁      
67   軟件管理   #   ./configure  --prefix=/usr/local/   編譯前配置      
68   軟件管理   #   make   編譯      
69   軟件管理   #   make install   安裝編譯好的源碼包      
70   啟動(dòng)管理   #   reboot   Init 6   重啟LINUX系統(tǒng)      
71   啟動(dòng)管理   #   Halt   Init 0   Shutdown –h now   關(guān)閉LINUX系統(tǒng)      
72   啟動(dòng)管理   #   runlevel      顯示系統(tǒng)運(yùn)行級(jí)      
73   啟動(dòng)管理   #   Init [0123456]       改變系統(tǒng)運(yùn)行級(jí),7種      
74   啟動(dòng)管理   #   Chkconfig –-list [服務(wù)名稱(chēng)]   查看服務(wù)的狀態(tài)      
75   啟動(dòng)管理   #   Chkconfig –-level <運(yùn)行級(jí)> <服務(wù)名> on|off|set    設(shè)置服務(wù)的啟動(dòng)狀態(tài)      
76   啟動(dòng)管理   #   Chkconfig <服務(wù)名> on|off|set   設(shè)置非獨(dú)立服務(wù)啟狀態(tài)      
77   進(jìn)程管理   #   Top動(dòng)態(tài)   Ps-aux靜態(tài)   進(jìn)程樹(shù)pstree    查看系統(tǒng)進(jìn)程      
78   進(jìn)程管理   #   程序名 &   后臺(tái)運(yùn)行程序         
79   進(jìn)程管理   #   fg   把后臺(tái)運(yùn)行的進(jìn)程調(diào)回前臺(tái)         
80   進(jìn)程管理   #   bg   把前臺(tái)運(yùn)行進(jìn)程調(diào)到后臺(tái)         
81   進(jìn)程管理   #   renice   Renice +1 180    把180號(hào)進(jìn)程的優(yōu)先級(jí)加1      
82   進(jìn)程管理   #   kill   Kill PID    終止某個(gè)PID進(jìn)程      
83   進(jìn)程管理   #   at   at 5pm + 3 days
                    /bin/ls   指定三天后下午5:00執(zhí)行/bin/ls      
84   進(jìn)程管理   #   crontab   Crontab -e   用VI的形式來(lái)編輯自動(dòng)周期性任務(wù)      
85   進(jìn)程管理   #   crontab   Crontab -l   查看自動(dòng)周期性任務(wù)      
86   進(jìn)程管理   #   crontab   Crontab -r   刪除自動(dòng)周期性任務(wù)      
87   進(jìn)程管理   #   crond   Service crond <start|stop|restart|status>      
   馬上啟動(dòng)自動(dòng)周期性服務(wù)   Service crond <啟動(dòng)|停止|重啟|狀態(tài)>      
            
   實(shí)現(xiàn)磁盤(pán)配額   (注安裝LINUX時(shí)建立/home分區(qū))
目標(biāo):對(duì)用戶zhao在/home目錄上實(shí)現(xiàn)soft limit為5k,hard limit 為10k的磁盤(pán)配額
實(shí)現(xiàn)步驟:
1. 修改包含/home的行,  #vi /etc/fstab, 改為:defaults,usrquota。也就是增加usrquota項(xiàng)。然后保存退出。
2、卸載/home目錄                           #umount /home
3. 掛接/home目錄                           #mount /home
4、增加用戶zhao                            #useradd zhao 
5、修改密碼                                #passwd zhao 
6、生成關(guān)于/home目錄的quota信息              #quotacheck -cmug /home 
                                         #quotacheck -vu /home 
7、查看所有用戶的信息                        #repquota -au
8、設(shè)置配額                                #edquota -u zhao
將soft 和hard 分別改為5和10
9、保存并退出                               #wq! 
10、修改時(shí)間                                #edquota -t 
11、                                      #wq!
12.開(kāi)啟/home上的磁盤(pán)配額功能                 #quotaon /home
13.查詢(xún)配額                                #quota -u zhao
14.驗(yàn)證配額                                #su - zhao 
                                          $touch myfile

T.S Liu 2008-06-05 10:14 發(fā)表評(píng)論
]]>
ubuntu一些基本操作用法!(轉(zhuǎn))http://www.shnenglu.com/liu1061/articles/52174.htmlT.S LiuT.S LiuWed, 04 Jun 2008 08:44:00 GMThttp://www.shnenglu.com/liu1061/articles/52174.htmlhttp://www.shnenglu.com/liu1061/comments/52174.htmlhttp://www.shnenglu.com/liu1061/articles/52174.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/52174.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/52174.html如何列出硬盤(pán)分割表?
sudo fdisk -l
  • 您可以使用 系統(tǒng) -> 管理 -> Disks

[編輯] 如何列出硬盤(pán)檔案系統(tǒng)使用狀況?

df -T -h
  • 您可以使用 系統(tǒng) -> 管理 -> Disks

[編輯] 如何列出掛載的設(shè)備?

mount

[編輯] 如何列出 PCI 設(shè)備?

lspci

[編輯] 如何列出 USB 設(shè)備?

lsusb

[編輯] 如何提高 CD/DVD-ROM 速度?

e.g. 假設(shè) CD/DVD-ROM設(shè)備 位置是 /dev/cdrom
sudo hdparm -d1 /dev/cdrom
sudo cp /etc/hdparm.conf /etc/hdparm.conf_backup
sudo gedit /etc/hdparm.conf
  • 檔案后面增加此行敘述
/dev/cdrom {
dma = on
}
  • 儲(chǔ)存編輯過(guò)的檔案

[編輯] 如何手動(dòng) 掛載/卸載 CD/DVD-ROM , 并且顯示所有隱藏以及關(guān)聯(lián)的 檔案/資料夾?

e.g. 假設(shè) CD/DVD-ROM 位置是 /media/cdrom0/
  • 掛載 CD/DVD-ROM
sudo mount /media/cdrom0/ -o unhide
  • 卸載 CD/DVD-ROM
sudo umount /media/cdrom0/

[編輯] 如何手動(dòng)強(qiáng)制卸載 CD/DVD-ROM ?

e.g. 假設(shè) CD/DVD-ROM 位置是 /media/cdrom0/
sudo umount /media/cdrom0/ -l

[編輯] 如何不用重開(kāi)機(jī)下掛載 /etc/fstab ?

sudo mount -a

[編輯] CD/DVD 燒錄

[編輯] 如何清除 CD-RW/DVD-RW?

e.g. 假設(shè) CD/DVD-ROM 位置為 /dev/cdrom
sudo umount /dev/cdrom
cdrecord dev=/dev/cdrom blank=fast

[編輯] 如何燒錄 檔案/資料夾 至 CD/DVD?

nautilus burn:///
  • CD/DVD 光盤(pán)制作程序 : 檔案瀏覽器
  • 拖曳 檔案/資料夾 至窗口內(nèi)
檔案選單 -> 燒錄光盤(pán)... -> 燒錄

[編輯] 如何燒錄影像檔 (ISO) 至 CD/DVD?

點(diǎn)選影像檔(ISO)右鍵 -> 燒錄光盤(pán)... -> 燒錄

[編輯] 如何復(fù)制 CD/DVD?

[編輯] 如何從 CD/DVD 建立影像檔 (ISO)?

e.g. 假設(shè) CD/DVD-ROM 位置為 /dev/cdrom
sudo umount /dev/cdrom
dd if=/dev/cdrom of=file.iso bs=1024

[編輯] 如何將資料夾資料建立成影像檔(ISO)?

mkisofs -o file.iso /location_of_folder/

[編輯] 如何產(chǎn)生 MD5 檢查碼檔案?

md5sum file.iso > file.iso.md5

[編輯] 如何檢查檔案的 MD5 碼?

e.g. 假設(shè) file.iso 以及 file.iso.md5 位于相同的目錄
md5sum -c file.iso.md5

[編輯] 如何不透過(guò)燒錄而 掛載/卸載 影像檔 (ISO) ?

sudo mkdir /media/iso
sudo modprobe loop
sudo mount file.iso /media/iso/ -t iso9660 -o loop
  • 卸載影像檔 (ISO)
sudo umount /media/iso/

[編輯] 如何 設(shè)定/改變 CD/DVD 燒錄速度?

  • 請(qǐng)參閱 #基本備注
  • 應(yīng)用程序 -> 系統(tǒng)工具 -> 組態(tài)編輯器
  • 組態(tài)編輯器
/ -> apps -> nautilus-cd-burner -> default_speed (設(shè)定/改變 燒錄速度)

[編輯] 如何啟動(dòng) CD/DVD 燒錄 burnproof?

  • 請(qǐng)參閱 #基本備注
  • 應(yīng)用程序 -> 系統(tǒng)工具 -> 組態(tài)編輯器
  • 組態(tài)編輯器
/ -> apps -> nautilus-cd-burner -> burnproof (勾選)

[編輯] 如何啟動(dòng) CD/DVD 超燒?

  • 請(qǐng)參閱 #基本備注
  • 應(yīng)用程序 -> 系統(tǒng)工具 -> 組態(tài)編輯器
  • 組態(tài)編輯器
/ -> apps -> nautilus-cd-burner -> overburn (勾選)

[編輯] 網(wǎng)絡(luò)

[編輯] 如何設(shè)定 Google Talk?

[編輯] 如何 啟動(dòng)/關(guān)閉 網(wǎng)絡(luò)連線?

  • 請(qǐng)參閱 #基本備注
  • 系統(tǒng) -> 管理 -> 網(wǎng)絡(luò)
  • 網(wǎng)絡(luò)連線
連線 -> 選擇 "以太網(wǎng)連線" -> 啟動(dòng)/停止使用

[編輯] 如何設(shè)定網(wǎng)絡(luò)連線?

  • 請(qǐng)參閱 #基本備注
  • 系統(tǒng) -> 管理 -> 網(wǎng)絡(luò)
  • 網(wǎng)絡(luò)連線
連線 -> 選擇 "以太網(wǎng)連線" -> 屬性
連線 -> 啟動(dòng)這個(gè)連線 (勾選)
連線設(shè)定 -> 組態(tài): 選擇 "DHCP/固定 IP 位址"
DNS -> DNS 服務(wù)器 -> 新增/刪除

[編輯] 如何設(shè)定撥號(hào)連線?

sudo pppconfig
  • 開(kāi)始連線
sudo pon provider_name
  • 結(jié)束連線
sudo poff

[編輯] 如何設(shè)定寬帶連線?

sudo pppoeconf

[編輯] 如何修改主機(jī)名稱(chēng)?

  • 請(qǐng)參閱 #基本備注
  • 系統(tǒng) -> 管理 -> 網(wǎng)絡(luò)
  • 網(wǎng)絡(luò)設(shè)定
一般 -> 主機(jī)設(shè)定 -> 主機(jī)名稱(chēng): 指定計(jì)算機(jī)名稱(chēng)
  • 儲(chǔ)存并且關(guān)閉所有已開(kāi)啟的應(yīng)用程序,并重開(kāi)機(jī)。

[編輯] 如何修改主機(jī)敘述?

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup
sudo gedit /etc/samba/smb.conf
  • 找此行
...
server string = %h server (Samba, Ubuntu)
...
  • 將以下敘述取代此行
  server string = new_computer_descriptions
  • 儲(chǔ)存編輯過(guò)的檔案
sudo testparm
sudo /etc/init.d/samba restart

[編輯] 如何改變主機(jī)網(wǎng)域/工作群組?

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup
sudo gedit /etc/samba/smb.conf
  • 找此行
...
workgroup = MSHOME
...
  • 將以下敘述取代
  workgroup = new_domain_or_workgroup
  • 儲(chǔ)存編輯過(guò)的檔案
sudo testparm
sudo /etc/init.d/samba restart

[編輯] 如何用免費(fèi) DynDNS 服務(wù)指定使用動(dòng)態(tài)IP本機(jī)的名稱(chēng)?

e.g. 假設(shè)因特網(wǎng)連線組態(tài)已經(jīng)完成
注冊(cè)免費(fèi)動(dòng)態(tài) DNS 服務(wù) https://www.dyndns.org
每一小時(shí)自動(dòng)更新 IP 至 DynDNS Database/DNS
* * * * * 代表 分 時(shí) 日 月 星期
sudo apt-get install ipcheck
sudo gedit /root/dyndns_update.sh
  • 在新增的檔案內(nèi)加入下面這幾行
USERNAME=myusername
PASSWORD=mypassword
HOSTNAME=myhostname.dyndns.org
cd /root/
if [ -f /root/ipcheck.dat ]; then
ipcheck -r checkip.dyndns.org:8245 $USERNAME $PASSWORD $HOSTNAME
else
ipcheck --makedat -r checkip.dyndns.org:8245 $USERNAME $PASSWORD $HOSTNAME
fi
  • 儲(chǔ)存編輯過(guò)的檔案
sudo chmod 700 /root/dyndns_update.sh
sudo sh /root/dyndns_update.sh
export EDITOR=gedit && sudo crontab -e
  • 在檔案后面加入下面這幾行
00 * * * * sudo sh /root/dyndns_update.sh
  • 儲(chǔ)存編輯過(guò)的檔案

[編輯] 如何簡(jiǎn)單分享資料夾?

資料夾上按右鍵 -> 共享資料夾
共享資料夾 -> 共享為: 選擇 "SMB"
共享內(nèi)容 -> 名稱(chēng): 指定共享名稱(chēng)

[編輯] 如何瀏覽網(wǎng)絡(luò)上計(jì)算機(jī)?

e.g. 假設(shè)局域網(wǎng)路已經(jīng)設(shè)定好了
如果計(jì)算機(jī)或者網(wǎng)絡(luò)資料夾無(wú)法找到,試著接存取他們。
請(qǐng)參閱 #如何不先掛載就讀取網(wǎng)絡(luò)分享檔案夾?
  • 位置 -> 網(wǎng)絡(luò)服務(wù)器

[編輯] 如何不先掛載就讀取網(wǎng)絡(luò)分享檔案夾?

例如:假設(shè)你已正確設(shè)定好網(wǎng)絡(luò)連線
網(wǎng)絡(luò)上分享出資料夾的計(jì)算機(jī)IP位址是: 192.168.0.1
分享出來(lái)的資料夾名稱(chēng)是: linux
  • 應(yīng)用程序 -> 執(zhí)行命令...
  • 輸入并執(zhí)行以下指令
smb://192.168.0.1/linux

[編輯] 如何手動(dòng) 掛載/卸載 網(wǎng)絡(luò)分享的資料夾,并予許所有使用者讀取?

e.g. 假設(shè)網(wǎng)絡(luò)連線已經(jīng)設(shè)定完成
網(wǎng)絡(luò)計(jì)算機(jī) IP: 192.168.0.1
網(wǎng)絡(luò)計(jì)算機(jī)帳號(hào): myusername
網(wǎng)絡(luò)計(jì)算機(jī)密碼: mypassword
分享資料夾名稱(chēng): linux
本機(jī)掛載資料夾: /media/sharename
  • 掛載網(wǎng)絡(luò)資料夾
sudo mkdir /media/sharename
sudo mount //192.168.0.1/linux /media/sharename/ -o username=myusername,password=mypassword
  • 卸載網(wǎng)絡(luò)資料夾
sudo umount /media/sharename/

[編輯] 如何手動(dòng)掛載/卸除網(wǎng)絡(luò)共享檔案夾, 并允許所有使用者都可讀取和寫(xiě)入?

e.g. 假設(shè)網(wǎng)絡(luò)連線已經(jīng)設(shè)定完成
網(wǎng)絡(luò)計(jì)算機(jī) IP: 192.168.0.1
網(wǎng)絡(luò)計(jì)算機(jī)帳號(hào): myusername
網(wǎng)絡(luò)計(jì)算機(jī)密碼: mypassword
分享資料夾名稱(chēng): linux
本機(jī)掛載資料夾: /media/sharename
  • 掛載網(wǎng)絡(luò)資料夾
sudo mkdir /media/sharename
sudo mount //192.168.0.1/linux /media/sharename/ -o username=myusername,password=mypassword,dmask=777,fmask=777
  • 卸載網(wǎng)絡(luò)資料夾
sudo umount /media/sharename/

[編輯] 如何在系統(tǒng)啟動(dòng)時(shí), 自動(dòng)掛載網(wǎng)絡(luò)分享檔案夾, 并允許所有使用者都可讀取 ?

e.g. 假設(shè)網(wǎng)絡(luò)連線已經(jīng)設(shè)定完成
網(wǎng)絡(luò)計(jì)算機(jī) IP: 192.168.0.1
網(wǎng)絡(luò)計(jì)算機(jī)帳號(hào): myusername
網(wǎng)絡(luò)計(jì)算機(jī)密碼: mypassword
分享資料夾名稱(chēng): linux
本機(jī)掛載資料夾: /media/sharename
sudo mkdir /media/sharename
sudo gedit /root/.smbcredentials
  • 在新增的檔案內(nèi)加入下面這幾行
username=myusername
password=mypassword
  • 儲(chǔ)存編輯過(guò)的檔案
sudo chmod 700 /root/.smbcredentials
sudo cp /etc/fstab /etc/fstab_backup
sudo gedit /etc/fstab
  • 在檔案后面加入下面這幾行
//192.168.0.1/linux    /media/sharename smbfs  credentials=/root/.smbcredentials    0    0

[編輯] 如何在系統(tǒng)啟動(dòng)時(shí), 自動(dòng)掛載網(wǎng)絡(luò)分享檔案夾, 并允許所有使用者都可讀取 ?

e.g. 假設(shè)網(wǎng)絡(luò)連線已經(jīng)設(shè)定完成
網(wǎng)絡(luò)計(jì)算機(jī) IP: 192.168.0.1
網(wǎng)絡(luò)計(jì)算機(jī)帳號(hào): myusername
網(wǎng)絡(luò)計(jì)算機(jī)密碼: mypassword
分享資料夾名稱(chēng): linux
本機(jī)掛載資料夾: /media/sharename
sudo mkdir /media/sharename
sudo gedit /root/.smbcredentials
  • 在新增的檔案內(nèi)加入下面這幾行
username=myusername
password=mypassword
  • 儲(chǔ)存編輯過(guò)的檔案
sudo chmod 700 /root/.smbcredentials
sudo cp /etc/fstab /etc/fstab_backup
sudo gedit /etc/fstab
  • 在檔案后面加入下面這幾行
//192.168.0.1/linux    /media/sharename smbfs  credentials=/root/.smbcredentials,dmask=777,fmask=777  0    0

[編輯] 如何取得無(wú)線網(wǎng)絡(luò)模組(ipw2200)并且使用無(wú)線資料傳輸協(xié)定(WAP)?

[編輯] 遠(yuǎn)端桌面

[編輯] 如何設(shè)定遠(yuǎn)端桌面 (沒(méi)有安全性)?

警告! 遠(yuǎn)端桌面只在 GNOME 登入 session 運(yùn)作
離開(kāi)計(jì)算機(jī)而未注意 GNOME 登入 session 是不安全
使用 (系統(tǒng) -> 鎖定劃面) 并且離開(kāi)計(jì)算機(jī)時(shí)關(guān)掉螢?zāi)?/em>
  • 系統(tǒng) -> 偏好管理 -> 遠(yuǎn)端桌面
  • 遠(yuǎn)端桌面偏好設(shè)定
共享 ->
允許其他使用者觀看您的桌面 (勾選)
允許其他使用者控制您的桌面 (勾選)
安全性 ->
詢(xún)問(wèn)您已確認(rèn) (不勾選)
使用者需要輸入密碼: (勾選)
密碼: 指定密碼

[編輯] 如何連結(jié)遠(yuǎn)端 Ubuntu 桌面?

e.g. Assumed that remote Ubuntu machine have configured Remote Desktop
Read #如何設(shè)定遠(yuǎn)端桌面 (沒(méi)有安全性)?
Remote Ubuntu machine: 192.168.0.1
vncviewer -fullscreen 192.168.0.1:0
  • To quit vncviewer
Press 'F8' -> Quit viewer

[編輯] 如何從 Windows 機(jī)器上連結(jié)遠(yuǎn)端 Ubuntu 桌面?

e.g. Assumed that remote Ubuntu machine have configured Remote Desktop
Read #如何設(shè)定遠(yuǎn)端桌面 (沒(méi)有安全性)?
Remote Ubuntu machine: 192.168.0.1
  • Download VNC Viewer: Here

[編輯] Windows

[編輯] 如何手動(dòng) 掛載/卸載 Windows 分割區(qū) (NTFS) , 并且允許所有使用者只能讀取?


e.g. 假設(shè) Windows 分割區(qū) (NTFS) 位置是 /dev/hda1
本地掛載資料夾: /media/windows
  • 掛載 Windows 分割區(qū)
sudo mkdir /media/windows
sudo mount /dev/hda1 /media/windows/ -t ntfs -o nls=utf8,umask=0222
  • 卸載 Windows 分割區(qū)
sudo umount /media/windows/

[編輯] 如何手動(dòng) 掛載/卸載 Windows 分割區(qū) (FAT) , 并且允許所有使用者能讀取以及寫(xiě)入?

e.g. 假設(shè) Windows 分割區(qū) (FAT) 位置為 /dev/hda1
本地掛載資料夾: /media/windows
  • 掛載 Windows 分割區(qū)
sudo mkdir /media/windows
sudo mount /dev/hda1 /media/windows/ -t vfat -o iocharset=utf8,umask=000
  • 卸載 Windows 分割區(qū)
sudo umount /media/windows/

[編輯] 如何開(kāi)機(jī)時(shí)掛載 Windows 分割區(qū) (NTFS) , 并且允許所有使用者讀取?

e.g. 假設(shè) Windows 分割區(qū) (NTFS) 位置為 /dev/hda1
本地掛載資料夾: /media/windows
sudo mkdir /media/windows
sudo cp /etc/fstab /etc/fstab_backup
sudo gedit /etc/fstab
  • 在檔案后面加入下面這幾行
/dev/hda1    /media/windows ntfs  nls=utf8,umask=0222 0    0

[編輯] 如何開(kāi)機(jī)時(shí)掛載 Windows 分割區(qū) (FAT), 并且允許所有使用者讀取/寫(xiě)入?

e.g. 假定 Windows 分割區(qū) (FAT) 位置為 /dev/hda1
本地掛載資料夾: /media/windows
sudo mkdir /media/windows
sudo cp /etc/fstab /etc/fstab_backup
sudo gedit /etc/fstab
  • 在檔案后面加入下面這幾行
/dev/hda1    /media/windows vfat  iocharset=utf8,umask=000  0    0


]]>
用GDB調(diào)試程序http://www.shnenglu.com/liu1061/articles/51895.htmlT.S LiuT.S LiuMon, 02 Jun 2008 09:09:00 GMThttp://www.shnenglu.com/liu1061/articles/51895.htmlhttp://www.shnenglu.com/liu1061/comments/51895.htmlhttp://www.shnenglu.com/liu1061/articles/51895.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/51895.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/51895.html閱讀全文

]]>
gcc和g++的區(qū)別http://www.shnenglu.com/liu1061/articles/51872.htmlT.S LiuT.S LiuMon, 02 Jun 2008 04:37:00 GMThttp://www.shnenglu.com/liu1061/articles/51872.htmlhttp://www.shnenglu.com/liu1061/comments/51872.htmlhttp://www.shnenglu.com/liu1061/articles/51872.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/51872.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/51872.html轉(zhuǎn)
2008-03-18 00:32
http://www.yuanma.org/data/2007/0406/article_2498.htm
gcc和g++的區(qū)別
我們?cè)诰幾gc/c++代碼的時(shí)候,有人用gcc,有人用g++,于是各種說(shuō)法都來(lái)了,譬如c代碼用gcc,而c++代碼用g++,或者說(shuō)編譯用 gcc,鏈接用g++,一時(shí)也不知哪個(gè)說(shuō)法正確,如果再遇上個(gè)extern "C",分歧就更多了,這里我想作個(gè)了結(jié),畢竟知識(shí)的目的是令人更清醒,而不是更糊涂。
誤區(qū)一:gcc只能編譯c代碼,g++只能編譯c++代碼

兩者都可以,但是請(qǐng)注意:
1.后綴為.c的,gcc把它當(dāng)作是C程序,而g++當(dāng)作是c++程序;后綴為.cpp的,兩者都會(huì)認(rèn)為是c++程序,注意,雖然c++是c的超集,但是兩者對(duì)語(yǔ)法的要求是有區(qū)別的,例如:
#include <stdio.h>
int main(int argc, char* argv[]) {
   if(argv == 0) return;
   printString(argv);
   return;
}
int printString(char* string) {
sprintf(string, "This is a test.\n");
}
如果按照C的語(yǔ)法規(guī)則,OK,沒(méi)問(wèn)題,但是,一旦把后綴改為cpp,立刻報(bào)三個(gè)錯(cuò):“printString未定義”;
“cannot convert `char**' to `char*”;
”return-statement with no value“;
分別對(duì)應(yīng)前面紅色標(biāo)注的部分。可見(jiàn)C++的語(yǔ)法規(guī)則更加嚴(yán)謹(jǐn)一些。
2.編譯階段,g++會(huì)調(diào)用gcc,對(duì)于c++代碼,兩者是等價(jià)的,但是因?yàn)間cc命令不能自動(dòng)和C++程序使用的庫(kù)聯(lián)接,所以通常用g++來(lái)完成鏈接,為了統(tǒng)一起見(jiàn),干脆編譯/鏈接統(tǒng)統(tǒng)用g++了,這就給人一種錯(cuò)覺(jué),好像cpp程序只能用g++似的。
誤區(qū)二:gcc不會(huì)定義__cplusplus宏,而g++會(huì)

實(shí)際上,這個(gè)宏只是標(biāo)志著編譯器將會(huì)把代碼按C還是C++語(yǔ)法來(lái)解釋?zhuān)缟纤觯绻缶Y為.c,并且采用gcc編譯器,則該宏就是未定義的,否則,就是已定義。
誤區(qū)三:編譯只能用gcc,鏈接只能用g++

嚴(yán)格來(lái)說(shuō),這句話不算錯(cuò)誤,但是它混淆了概念,應(yīng)該這樣說(shuō):編譯可以用gcc/g++,而鏈接可以用g++或者gcc -lstdc++。因?yàn)間cc命令不能自動(dòng)和C++程序使用的庫(kù)聯(lián)接,所以通常使用g++來(lái)完成聯(lián)接。但在編譯階段,g++會(huì)自動(dòng)調(diào)用gcc,二者等價(jià)。
誤區(qū)四:extern "C"與gcc/g++有關(guān)系

實(shí)際上并無(wú)關(guān)系,無(wú)論是gcc還是g++,用extern "c"時(shí),都是以C的命名方式來(lái)為symbol命名,否則,都以c++方式命名。試驗(yàn)如下:
me.h
extern "C" void CppPrintf(void);
me.cpp:
#include <iostream>
#include "me.h"
using namespace std;
void CppPrintf(void)
{
     cout << "Hello\n";
}
test.cpp:
#include <stdlib.h>
#include <stdio.h>
#include "me.h"        
int main(void)
{
    CppPrintf();
    return 0;
}
1. 先給me.h加上extern "C",看用gcc和g++命名有什么不同

[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv        //注意此函數(shù)的命名
        .type   CppPrintf, @function
[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv        //注意此函數(shù)的命名
        .type   CppPrintf, @function
完全相同!
               
2. 去掉me.h中extern "C",看用gcc和g++命名有什么不同

[root@root GCC]# gcc -S me.cpp
[root@root GCC]# less me.s
.globl _Z9CppPrintfv        //注意此函數(shù)的命名
        .type   _Z9CppPrintfv, @function
[root@root G++]# g++ -S me.cpp
[root@root G++]# less me.s
.globl _Z9CppPrintfv        //注意此函數(shù)的命名
        .type   _Z9CppPrintfv, @function
完全相同!
【結(jié)論】完全相同,可見(jiàn)extern "C"與采用gcc/g++并無(wú)關(guān)系,以上的試驗(yàn)還間接的印證了前面的說(shuō)法:在編譯階段,g++是調(diào)用gcc的。


]]>
gcc/g++ 常用選項(xiàng)http://www.shnenglu.com/liu1061/articles/51870.htmlT.S LiuT.S LiuMon, 02 Jun 2008 04:32:00 GMThttp://www.shnenglu.com/liu1061/articles/51870.htmlhttp://www.shnenglu.com/liu1061/comments/51870.htmlhttp://www.shnenglu.com/liu1061/articles/51870.html#Feedback0http://www.shnenglu.com/liu1061/comments/commentRss/51870.htmlhttp://www.shnenglu.com/liu1061/services/trackbacks/51870.html轉(zhuǎn)
http://blog.csdn.net/blade2001/archive/2007/06/10/1646530.aspx

gcc and g++分別是gnu的c & c++編譯器 gcc/g++在執(zhí)行編譯工作的時(shí)候,總共需要4步

1.預(yù)處理,生成.i的文件[預(yù)處理器cpp]
2.將預(yù)處理后的文件不轉(zhuǎn)換成匯編語(yǔ)言,生成文件.s[編譯器egcs]
3.有匯編變?yōu)槟繕?biāo)代碼(機(jī)器代碼)生成.o的文件[匯編器as]
4.連接目標(biāo)代碼,生成可執(zhí)行程序[鏈接器ld]
[參數(shù)詳解]
-x language filename
設(shè)定文件所使用的語(yǔ)言,使后綴名無(wú)效,對(duì)以后的多個(gè)有效.也就是根據(jù)約定C語(yǔ)言的后
綴名稱(chēng)是.c的,而C++的后綴名是.C或者.cpp,如果你很個(gè)性,決定你的C代碼文件的后綴
名是.pig 哈哈,那你就要用這個(gè)參數(shù),這個(gè)參數(shù)對(duì)他后面的文件名都起作用,除非到了
下一個(gè)參數(shù)的使用。
可以使用的參數(shù)嗎有下面的這些
`c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a
ssembler-with-cpp'.
看到英文,應(yīng)該可以理解的。
例子用法:
gcc -x c hello.pig

-x none filename
關(guān)掉上一個(gè)選項(xiàng),也就是讓gcc根據(jù)文件名后綴,自動(dòng)識(shí)別文件類(lèi)型
例子用法:
gcc -x c hello.pig -x none hello2.c

-c
只激活預(yù)處理,編譯,和匯編,也就是他只把程序做成obj文件
例子用法:
gcc -c hello.c
他將生成.o的obj文件
-S
只激活預(yù)處理和編譯,就是指把文件編譯成為匯編代碼。
例子用法
gcc -S hello.c
他將生成.s的匯編代碼,你可以用文本編輯器察看
-E
只激活預(yù)處理,這個(gè)不生成文件,你需要把它重定向到一個(gè)輸出文件里面.
例子用法:
gcc -E hello.c > pianoapan.txt
gcc -E hello.c | more
慢慢看吧,一個(gè)hello word 也要與處理成800行的代碼
-o
制定目標(biāo)名稱(chēng),缺省的時(shí)候,gcc 編譯出來(lái)的文件是a.out,很難聽(tīng),如果你和我有同感
,改掉它,哈哈
例子用法
gcc -o hello.exe hello.c (哦,windows用習(xí)慣了)
gcc -o hello.asm -S hello.c
-pipe
使用管道代替編譯中臨時(shí)文件,在使用非gnu匯編工具的時(shí)候,可能有些問(wèn)題
gcc -pipe -o hello.exe hello.c
-ansi
關(guān)閉gnu c中與ansi c不兼容的特性,激活ansi c的專(zhuān)有特性(包括禁止一些asm inl
ine typeof關(guān)鍵字,以及UNIX,vax等預(yù)處理宏,
-fno-asm
此選項(xiàng)實(shí)現(xiàn)ansi選項(xiàng)的功能的一部分,它禁止將asm,inline和typeof用作關(guān)鍵字。

-fno-strict-prototype
只對(duì)g++起作用,使用這個(gè)選項(xiàng),g++將對(duì)不帶參數(shù)的函數(shù),都認(rèn)為是沒(méi)有顯式的對(duì)參數(shù)
的個(gè)數(shù)和類(lèi)型說(shuō)明,而不是沒(méi)有參數(shù).
而gcc無(wú)論是否使用這個(gè)參數(shù),都將對(duì)沒(méi)有帶參數(shù)的函數(shù),認(rèn)為城沒(méi)有顯式說(shuō)明的類(lèi)型


-fthis-is-varialble
就是向傳統(tǒng)c++看齊,可以使用this當(dāng)一般變量使用.

-fcond-mismatch
允許條件表達(dá)式的第二和第三參數(shù)類(lèi)型不匹配,表達(dá)式的值將為void類(lèi)型

-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
這四個(gè)參數(shù)是對(duì)char類(lèi)型進(jìn)行設(shè)置,決定將char類(lèi)型設(shè)置成unsigned char(前兩個(gè)參
數(shù))或者 signed char(后兩個(gè)參數(shù))

-include file
包含某個(gè)代碼,簡(jiǎn)單來(lái)說(shuō),就是便以某個(gè)文件,需要另一個(gè)文件的時(shí)候,就可以用它設(shè)
定,功能就相當(dāng)于在代碼中使用#i nclude<filename>
例子用法:
gcc hello.c -include /root/pianopan.h

-imacros file
將file文件的宏,擴(kuò)展到gcc/g++的輸入文件,宏定義本身并不出現(xiàn)在輸入文件中

-Dmacro
相當(dāng)于C語(yǔ)言中的#define macro

-Dmacro=defn
相當(dāng)于C語(yǔ)言中的#define macro=defn

-Umacro
相當(dāng)于C語(yǔ)言中的#undef macro
-undef
取消對(duì)任何非標(biāo)準(zhǔn)宏的定義

-Idir
在你是用#i nclude"file"的時(shí)候,gcc/g++會(huì)先在當(dāng)前目錄查找你所制定的頭文件,如
果沒(méi)有找到,他回到缺省的頭文件目錄找,如果使用-I制定了目錄,他
回先在你所制定的目錄查找,然后再按常規(guī)的順序去找.
對(duì)于#i nclude<file>,gcc/g++會(huì)到-I制定的目錄查找,查找不到,然后將到系統(tǒng)的缺
省的頭文件目錄查找

-I-
就是取消前一個(gè)參數(shù)的功能,所以一般在-Idir之后使用

-idirafter dir
在-I的目錄里面查找失敗,講到這個(gè)目錄里面查找.

-iprefix prefix
-iwithprefix dir
一般一起使用,當(dāng)-I的目錄查找失敗,會(huì)到prefix+dir下查找

-nostdinc
使編譯器不再系統(tǒng)缺省的頭文件目錄里面找頭文件,一般和-I聯(lián)合使用,明確限定頭
文件的位置

-nostdin C++
規(guī)定不在g++指定的標(biāo)準(zhǔn)路經(jīng)中搜索,但仍在其他路徑中搜索,.此選項(xiàng)在創(chuàng)libg++庫(kù)
使用

-C
在預(yù)處理的時(shí)候,不刪除注釋信息,一般和-E使用,有時(shí)候分析程序,用這個(gè)很方便的


-M
生成文件關(guān)聯(lián)的信息。包含目標(biāo)文件所依賴(lài)的所有源代碼你可以用gcc -M hello.c
來(lái)測(cè)試一下,很簡(jiǎn)單。

-MM
和上面的那個(gè)一樣,但是它將忽略由#i nclude<file>造成的依賴(lài)關(guān)系。

-MD
和-M相同,但是輸出將導(dǎo)入到.d的文件里面

-MMD
和-MM相同,但是輸出將導(dǎo)入到.d的文件里面

-Wa,option
此選項(xiàng)傳遞option給匯編程序;如果option中間有逗號(hào),就將option分成多個(gè)選項(xiàng),然
后傳遞給會(huì)匯編程序

-Wl.option
此選項(xiàng)傳遞option給連接程序;如果option中間有逗號(hào),就將option分成多個(gè)選項(xiàng),然
后傳遞給會(huì)連接程序.

-llibrary
制定編譯的時(shí)候使用的庫(kù)
例子用法
gcc -lcurses hello.c
使用ncurses庫(kù)編譯程序

-Ldir
制定編譯的時(shí)候,搜索庫(kù)的路徑。比如你自己的庫(kù),可以用它制定目錄,不然
編譯器將只在標(biāo)準(zhǔn)庫(kù)的目錄找。這個(gè)dir就是目錄的名稱(chēng)。

-O0
-O1
-O2
-O3
編譯器的優(yōu)化選項(xiàng)的4個(gè)級(jí)別,-O0表示沒(méi)有優(yōu)化,-O1為缺省值,-O3優(yōu)化級(jí)別最高 
  
-g
只是編譯器,在編譯的時(shí)候,產(chǎn)生調(diào)試信息。

-gstabs
此選項(xiàng)以stabs格式聲稱(chēng)調(diào)試信息,但是不包括gdb調(diào)試信息.

-gstabs+
此選項(xiàng)以stabs格式聲稱(chēng)調(diào)試信息,并且包含僅供gdb使用的額外調(diào)試信息.

-ggdb
此選項(xiàng)將盡可能的生成gdb的可以使用的調(diào)試信息.
-static
此選項(xiàng)將禁止使用動(dòng)態(tài)庫(kù),所以,編譯出來(lái)的東西,一般都很大,也不需要什么
動(dòng)態(tài)連接庫(kù),就可以運(yùn)行.
-share
此選項(xiàng)將盡量使用動(dòng)態(tài)庫(kù),所以生成文件比較小,但是需要系統(tǒng)由動(dòng)態(tài)庫(kù).
-traditional
試圖讓編譯器支持傳統(tǒng)的C語(yǔ)言特性


]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品久久久久av免费| 一区二区三区精品视频在线观看| 欧美成人免费在线观看| 99国产精品久久久久老师| 亚洲美女性视频| 国产精品卡一卡二| 久久久噜噜噜久久人人看| 免费在线播放第一区高清av| 99riav久久精品riav| 亚洲午夜黄色| 伊大人香蕉综合8在线视| 亚洲国产欧美一区二区三区丁香婷| 欧美精品日本| 午夜精品在线观看| 久久久久久久精| 一本久久知道综合久久| 亚洲欧美日韩国产中文| 亚洲成色最大综合在线| 日韩视频久久| 国产亚洲欧美色| 亚洲激情图片小说视频| 国产伦精品一区二区三区| 免费在线亚洲| 欧美视频导航| 久热这里只精品99re8久| 欧美日韩国产色视频| 久久精品99| 欧美激情第三页| 欧美在线免费播放| 欧美丰满高潮xxxx喷水动漫| 欧美一区二区精品在线| 欧美成人精品| 欧美中文字幕在线播放| 欧美激情综合色| 欧美一区二区在线免费观看| 你懂的国产精品永久在线| 午夜久久影院| 欧美va亚洲va香蕉在线| 久久岛国电影| 欧美日韩第一区| 老司机精品福利视频| 欧美性猛交99久久久久99按摩| 久久资源在线| 国产精品久久久久一区二区三区共| 欧美ed2k| 国产欧美日韩免费看aⅴ视频| 亚洲第一偷拍| 国产真实久久| 中文精品一区二区三区| 亚洲国产人成综合网站| 亚洲欧美日韩另类精品一区二区三区| 亚洲欧洲一区| 欧美专区福利在线| 亚洲自拍偷拍麻豆| 欧美大片在线观看| 久久视频精品在线| 国产精品视频成人| 亚洲精品免费网站| 在线精品观看| 欧美一进一出视频| 亚洲欧美日产图| 欧美激情精品久久久久久免费印度 | 99re8这里有精品热视频免费| 一区二区视频免费完整版观看| 亚洲一区二区欧美| 日韩一级黄色av| 久久综合一区| 久久精品日产第一区二区| 欧美日韩中字| 亚洲狠狠丁香婷婷综合久久久| 激情欧美国产欧美| 亚洲欧美综合一区| 亚洲欧美激情视频| 欧美日韩免费一区二区三区| 亚洲电影在线播放| 亚洲福利免费| 久久久久久一区二区| 久久精品观看| 国产精品自在在线| 亚洲一二区在线| 在线亚洲免费视频| 欧美激情一区在线观看| 欧美黄色视屏| 亚洲国语精品自产拍在线观看| 久久久久欧美精品| 久久久蜜臀国产一区二区| 国产欧美91| 亚洲欧美在线免费观看| 亚洲欧美一区二区在线观看| 欧美日韩在线第一页| 亚洲日本中文| 日韩性生活视频| 欧美精品一区二区在线观看| 亚洲国产精品久久精品怡红院| 亚洲国产精品ⅴa在线观看| 久久综合九色九九| 欧美电影免费观看网站| 在线看不卡av| 麻豆成人精品| 欧美电影免费观看大全| 亚洲激情图片小说视频| 美女啪啪无遮挡免费久久网站| 欧美福利电影在线观看| 亚洲国产日韩欧美综合久久| 美女被久久久| 亚洲国产日韩欧美在线99| 亚洲精选大片| 欧美日本国产精品| 一本色道**综合亚洲精品蜜桃冫| 亚洲午夜久久久久久尤物| 国产精品福利在线观看网址| 亚洲女爱视频在线| 久久精品99无色码中文字幕| 国产综合精品| 久久五月激情| 亚洲国产经典视频| 一区二区三区视频免费在线观看 | 亚洲人成77777在线观看网| 亚洲免费大片| 欧美午夜不卡视频| 亚洲综合大片69999| 久久久久久久欧美精品| 亚洲第一久久影院| 欧美另类亚洲| 亚洲一区3d动漫同人无遮挡| 久久精品官网| 亚洲国产一区二区三区a毛片| 欧美国产一区视频在线观看| 99视频国产精品免费观看| 欧美亚洲视频| 怡红院精品视频| 欧美精品免费在线观看| 中文精品一区二区三区| 久久久久久久欧美精品| 亚洲激情图片小说视频| 欧美日韩在线视频一区| 欧美一级二级三级蜜桃| 欧美成人乱码一区二区三区| 一片黄亚洲嫩模| 国产精品亚洲综合色区韩国| 久久精品欧美日韩精品| 亚洲国产欧美日韩精品| 午夜亚洲性色福利视频| 极品尤物av久久免费看| 欧美日本中文字幕| 亚洲欧美视频在线观看| 欧美激情精品久久久久久大尺度| 亚洲少妇自拍| 国内精品一区二区| 欧美日本一道本| 欧美一级网站| 亚洲国内自拍| 欧美一区三区三区高中清蜜桃| 亚洲国产精品www| 欧美天天影院| 久久久久国产精品厨房| 9l视频自拍蝌蚪9l视频成人| 久久久精品999| 一本色道久久综合| 国产一区二区三区久久久| 欧美精品二区| 久久成人亚洲| 99这里只有精品| 久热爱精品视频线路一| 亚洲一区日韩在线| 18成人免费观看视频| 国产精品久久久久久久久久三级| 老司机凹凸av亚洲导航| 亚洲综合电影| 亚洲国产第一页| 久久精品亚洲一区二区| 在线一区二区日韩| 伊人狠狠色j香婷婷综合| 国产精品va在线播放| 美女91精品| 午夜亚洲精品| 日韩亚洲综合在线| 欧美成人免费观看| 久久精品国产成人| 一区二区免费在线观看| 1024欧美极品| 国产日韩欧美另类| 欧美视频四区| 模特精品在线| 久久精品国产久精国产思思| 亚洲深夜av| 亚洲欧洲精品一区二区三区不卡 | 欧美激情中文不卡| 久久国产黑丝| 亚洲女女做受ⅹxx高潮| 亚洲伦理中文字幕| 一区二区视频在线观看| 国产欧美午夜| 欧美性开放视频| 欧美经典一区二区三区| 久久伊人亚洲| 久久成人精品电影| 亚洲欧美日本视频在线观看| 99riav国产精品| 亚洲国产小视频|