欧美一区二区三区免费观看视频,欧美一级片一区,久久成人一区二区http://m.shnenglu.com/liu1061/category/7273.html生活和工作都要充滿激情,否則你無法體會(huì)到淋漓盡致的快樂與痛苦zh-cnSat, 19 Sep 2009 11:33:52 GMTSat, 19 Sep 2009 11:33:52 GMT60learn sed 參數(shù)http://m.shnenglu.com/liu1061/articles/95101.htmlT.S LiuT.S LiuWed, 02 Sep 2009 07:14:00 GMThttp://m.shnenglu.com/liu1061/articles/95101.htmlhttp://m.shnenglu.com/liu1061/comments/95101.htmlhttp://m.shnenglu.com/liu1061/articles/95101.html#Feedback0http://m.shnenglu.com/liu1061/comments/commentRss/95101.htmlhttp://m.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寫入文件
[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命令就是將小寫轉(zhuǎn)換成了大寫,正則表達(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è)行,如果沒有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”開頭被替換為“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á)式最左邊開始,向右最多可以使用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í)入門指令!http://m.shnenglu.com/liu1061/articles/54897.htmlT.S LiuT.S LiuSun, 29 Jun 2008 02:14:00 GMThttp://m.shnenglu.com/liu1061/articles/54897.htmlhttp://m.shnenglu.com/liu1061/comments/54897.htmlhttp://m.shnenglu.com/liu1061/articles/54897.html#Feedback0http://m.shnenglu.com/liu1061/comments/commentRss/54897.htmlhttp://m.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 文件說明用戶的系統(tǒng)如何查詢節(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    記錄開機(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ù)庫
/lib/modules   kernel 的相關(guān)模塊
/var/lib/rpm   rpm套件安裝處
/lost+found    系統(tǒng)不正常產(chǎn)生錯(cuò)誤時(shí),會(huì)將一些遺失的片段放置於此目錄下
/mnt     外設(shè)的掛載點(diǎn)
/media   與/mnt類似
/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ù)庫
/usr/local/lib     系統(tǒng)會(huì)使用到的函數(shù)庫
/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  記錄開機(jī)或者是一些服務(wù)啟動(dòng)的時(shí)候,所顯示的啟動(dòng)或關(guān)閉訊息
/var/log/maillog   紀(jì)錄郵件存取或往來( 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ù)同步寫入硬盤        
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       由第一行開始顯示     cat |more  分頁
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  顯示硬盤分區(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  更新資料庫
mke2fs    格式化   mkfs -t ext3
dd if=/etc/passwd of=/tmp/passwd.bak    備份
mount     列出系統(tǒng)所有的分區(qū)
mount -t iso9660 /dev/cdrom /mnt/cdrom   掛載光盤
mount -t vfat /dev/fd0 /mnt/floppy       掛載軟盤
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    開啟網(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    每兩秒更新一次        top -d 2 -p10604   觀看某個(gè)PID
        top -b -n 2 > /tmp/top.txt ----->將 top 的資訊進(jìn)行 2 次,然後將結(jié)果輸出到 /tmp/top.txt   
pstree   以樹狀圖顯示程序    [A]以 ASCII 來連接, 列出PID, [p]列出帳號(hào)
killall   要?jiǎng)h除某個(gè)服務(wù)    killall -9 httpd
free      顯示內(nèi)存狀態(tài)     free -m  -------->以M為單位顯示
uptime    顯示目前系統(tǒng)開機(jī)時(shí)間
netstat   顯示網(wǎng)絡(luò)狀態(tài)    netstat -tulnp------>找出目前系統(tǒng)上已在監(jiān)聽的網(wǎng)路連線及其 PID
dmesg     顯示開機(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 程式打包的資料,並沒有壓縮過;
*.tar.gz tar 程式打包的檔案,其中並且經(jīng)過 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   解開包
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類似
groupdel   刪除組
su test    更改用戶   su -    進(jìn)入root,且使用root的環(huán)境變量
sudo       以其他身份來執(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     看誰在線                     
last        最近登陸主機(jī)的信息
lastlog     最近登入的時(shí)間    讀取 /var/log/lastlog
talk        與其他用戶交談
write       發(fā)送信息    write test   [ctrl]+d 發(fā)送
mesg        設(shè)置終端機(jī)的寫入權(quán)限    mesg n 禁止接收     mesg y
wall        向所有用戶發(fā)送信息    wall this is q test
mail        寫mail   
/etc/default/useradd    家目錄默認(rèn)設(shè)置
quota      顯示磁盤已使用的空間與限制     quota -guvs ----->秀出目前 root 自己的 quota 限制值
           quota -vu   查詢
quotacheck   檢查磁盤的使用空間與限制     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    開啟磁盤空間限制     quotaon -auvg -------->啟動(dòng)所有的具有 quota 的 filesystem
quotaoff   關(guān)閉磁盤空間限制     quotaoff -a  -------->關(guān)閉了 quota 的限制
repquota -av     查閱系統(tǒng)內(nèi)所有的具有 quota 的 filesystem 的限值狀態(tài)
Quota 從開始準(zhǔn)備 filesystem 的支援到整個(gè)設(shè)定結(jié)束的主要的步驟大概是:
1、設(shè)定 partition 的 filesystem 支援 quota 參數(shù):
由於 quota 必須要讓 partition 上面的 filesystem 支援才行,一般來說, 支援度最好的是 ext2/ext3 ,
其他的 filesystem 類型鳥哥我是沒有試過啦! 啟動(dòng) filesystem 支援 quota 最簡單就是編輯 /etc/fstab ,
使得準(zhǔn)備要開放的 quota 磁碟可以支援 quota 囉;
2、建立 quota 記錄檔:
剛剛前面講過,整個(gè) quota 進(jìn)行磁碟限制值記錄的檔案是 aquota.user/aquota.group,
要建立這兩個(gè)檔案就必須要先利用 quotacheck 掃瞄才行喔!
3、編輯 quota 限制值資料:
再來就是使用 edquota 來編輯每個(gè)使用者或群組的可使用空間囉;
4、重新掃瞄與啟動(dòng) quota :
設(shè)定好 quota 之後,建議可以再進(jìn)行一次 quotacheck ,然後再以 quotaon 來啟動(dòng)吧!
開機(jī)流程簡介
1、載入 BIOS 的硬體資訊,並取得第一個(gè)開機(jī)裝置的代號(hào);
2、讀取第一個(gè)開機(jī)裝置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的開機(jī)資訊;
3、載入 Kernel 作業(yè)系統(tǒng)核心資訊, Kernel 開始解壓縮,並且嘗試驅(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、登入之後開始以 Shell 控管主機(jī)。
在/etc/rc.d/rc3.d內(nèi),以S開頭的為開機(jī)啟動(dòng),以K開頭的為關(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  ----->查詢是否安裝             rpm -ql ------>查詢?cè)撎准械哪夸?br>rpm -qi ----->查詢套件的說明資料       rpm -qc[d] ----->設(shè)定檔與說明檔
rpm -ivh  ---->安裝                    rpm -V  -------->查看套件有否更動(dòng)過
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://m.shnenglu.com/liu1061/articles/54540.htmlT.S LiuT.S LiuWed, 25 Jun 2008 03:18:00 GMThttp://m.shnenglu.com/liu1061/articles/54540.htmlhttp://m.shnenglu.com/liu1061/comments/54540.htmlhttp://m.shnenglu.com/liu1061/articles/54540.html#Feedback0http://m.shnenglu.com/liu1061/comments/commentRss/54540.htmlhttp://m.shnenglu.com/liu1061/services/trackbacks/54540.html 摘要:
在 Unix 上寫過程序的人一般都遇到過 Makefile,尤其是用 C 來開發(fā)程序的人。用 make 來開發(fā)和編譯程序的確很方便,可是要寫出一個(gè)MakeFile就不那么簡單了。偏偏介紹 Makefile 的文件不多,GNU Make 那份印出來要幾百頁的文件,光看完 Overview 自己就快要先Over了,難怪許多人聞 Unix色變。本文將介紹如何利用 GNU Autoconf 及 Automake 這兩套軟件來幫助『自動(dòng)』產(chǎn)生 Makefile 文件,并且讓開發(fā)出來的的軟件可以象 Apache, MySQL 和常見的 GNU 軟件一樣,只要會(huì) ``./configure'', ``make'', ``make install'' 就可以把程序安裝到系統(tǒng)中。如果您有心開發(fā) Open Source 的軟件,或只是想在 Unix 系統(tǒng)下寫寫程序。希望這份介紹文件能幫助您輕松的進(jìn)入 Unix Programming 的殿堂。
1. 簡介
Makefile 基本上就是『目標(biāo)』(target), 『關(guān)聯(lián)』(dependencies) 和『動(dòng)作』三者所組成的一系列規(guī)則。而 make 就會(huì)根據(jù) Makefile 的規(guī)則來決定如何編譯 (compile) 和連接 (link) 程式。實(shí)際上,make 可做的不只是編譯和連接程序,例如 FreeBSD 的 port collection 中,Makefile還可以做到自動(dòng)下載遠(yuǎn)程程序,解壓縮 (extract) , 打補(bǔ)丁 (patch),設(shè)定,然后編譯,安裝到系統(tǒng)中。
Makefile 基本結(jié)構(gòu)雖然很簡單,但是妥善運(yùn)用這些規(guī)則就可以變換出許多不同的花樣。卻也因?yàn)檫@樣,許多剛剛開始學(xué)習(xí)寫Makefile 時(shí)會(huì)覺得沒有規(guī)范可以遵循,每個(gè)人寫出來的Makefile都不大一樣,不知道從哪里下手,而且常常會(huì)受到自己的開發(fā)環(huán)境的限制,只要環(huán)境參數(shù)不同或者路徑更改,可能 Makefile 就得跟著修改修改。雖然有 GNU Makefile Conventions (GNU Makefile慣例例)訂出一些使用 GNU 程式設(shè)計(jì)時(shí)撰寫 Makefile 的一些標(biāo)準(zhǔn)和規(guī)范,但是內(nèi)容很長而且很復(fù)雜,并且經(jīng)常作一些調(diào)整,為了減輕程序開發(fā)人員維護(hù)Makefile 的負(fù)擔(dān),因此出現(xiàn)了Automake。
程序設(shè)計(jì)者只需要寫一些預(yù)先定義好的宏 (macro),提交給Automake處理后會(huì)產(chǎn)生一個(gè)可以供 Autoconf 使用的 Makefile.in文件。再配合利用 Autoconf產(chǎn)生的自動(dòng)培植設(shè)置文件 configure 即可產(chǎn)生一份符合符合 GNU Makefile 慣例的 Makeifle 了。
2. 上路之前
在開始使用 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 的工具程序來作為開發(fā)的環(huán)境,這些工具都是屬于 Open Source Software 不但免費(fèi)而且功能強(qiáng)大。如果你是使用 Red Hat Linux 可以找到所有上述軟件的 rpm 文件,F(xiàn)reeBSD 也有現(xiàn)成的 package 可以直接安裝,或也可以自行下載這些軟件的源代碼回來安裝。下面的示例是在Red Hat Linux 5.2 + CLE2 的環(huán)境下所完成的。
3. 一個(gè)簡單的例子
Automake 所產(chǎn)生的 Makefile 除了可以做到程式的編譯和連接,也已經(jīng)把如何產(chǎn)生程序文件 (如 manual page, info 文件及 dvi 文件) 的動(dòng)作,還有把源碼文件包裝起來以供發(fā)布都考慮進(jìn)去了,所以程序源代碼所存放的目錄結(jié)構(gòu)最好符合GNU 的標(biāo)準(zhǔn)慣例,接下來就用一個(gè)hello.c 來做為例子。
在工作目錄下建立一個(gè)新的子目錄"devel"',再在 devel 下建立一個(gè)"hello"' 的子目錄,這個(gè)目錄將作為存放 hello這個(gè)程序及其相關(guān)文件的地方:
% mkdir devel
% cd devel
% mkdir hello
% cd hello
用編輯器寫一個(gè)hello.c文件,
#include
int main(int argc, char** argv) {
printf(``Hello, GNU!\n'');
return 0;
}
接下來就要用 Autoconf 及 Automake 來產(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'' 指令就可以開始編譯 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)生出來的 Makefile 秀給你的老闆,讓他從此對(duì)你刮目相看 :-)
4. 追根問底
上述產(chǎn)生Makefile 的過程和以往自行編寫的方式非常不一樣,舍棄傳統(tǒng)自定義make 的規(guī)則,使用 Automake 只需用到一些已經(jīng)定義好的宏就可以了。我們把宏及目標(biāo) (target)寫在Makefile.am 文件內(nèi),Automake 讀入 Makefile.am 文件后會(huì)把這一串已經(jīng)定義好的宏展開并產(chǎn)生相對(duì)應(yīng)的 Makefile.in 文件,然后再由 configure這個(gè) shell script 根據(jù) Makefile.in 產(chǎn)生合適的Makefile。

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

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


T.S Liu 2008-06-25 11:18 發(fā)表評(píng)論
]]>
vim參考手冊(cè)!http://m.shnenglu.com/liu1061/articles/54535.htmlT.S LiuT.S LiuWed, 25 Jun 2008 01:57:00 GMThttp://m.shnenglu.com/liu1061/articles/54535.htmlhttp://m.shnenglu.com/liu1061/comments/54535.htmlhttp://m.shnenglu.com/liu1061/articles/54535.html#Feedback0http://m.shnenglu.com/liu1061/comments/commentRss/54535.htmlhttp://m.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://m.shnenglu.com/liu1061/articles/53762.htmlT.S LiuT.S LiuTue, 17 Jun 2008 13:16:00 GMThttp://m.shnenglu.com/liu1061/articles/53762.htmlhttp://m.shnenglu.com/liu1061/comments/53762.htmlhttp://m.shnenglu.com/liu1061/articles/53762.html#Feedback0http://m.shnenglu.com/liu1061/comments/commentRss/53762.htmlhttp://m.shnenglu.com/liu1061/services/trackbacks/53762.html
2. 最簡C代碼分析

    為簡化問題,來分析一下最簡的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)表沒有去除。
    這正是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ù)的?;刂?br>    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ù)原?;?br>    main+0x16:     ret                ; main函數(shù)返回,回到上級(jí)調(diào)用
    >

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

    問題:誰調(diào)用了 main函數(shù)?
    
     在C語言的層面來看,main函數(shù)是一個(gè)程序的起始入口點(diǎn),而實(shí)際上,ELF可執(zhí)行文件的入口點(diǎn)并不是main而是_start。
     mdb也可以反匯編_start:
      
    > _start::dis                       ;從_start 的地址開始反匯編
    _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
    >

    問題:為什么用EAX寄存器保存函數(shù)返回值?
    實(shí)際上IA32并沒有規(guī)定用哪個(gè)寄存器來保存返回值。但如果反匯編Solaris/Linux的二進(jìn)制文件,就會(huì)發(fā)現(xiàn),都用EAX保存函數(shù)返回值。
    這不是偶然現(xiàn)象,是操作系統(tǒng)的ABI(Application Binary Interface)來決定的。
    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的棧是用來存放臨時(shí)數(shù)據(jù),而且是LIFO,即后進(jìn)先出的。棧的增長方向是從高地址向低地址增長,按字節(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ù),過程與PUSH相反,依次將ESP-4、ESP-3、ESP-2、ESP-1從棧內(nèi)彈出,放入一個(gè)32位寄存器。
    5) CALL指令用來調(diào)用一個(gè)函數(shù)或過程,此時(shí),下一條指令地址會(huì)被壓入堆棧,以備返回時(shí)能恢復(fù)執(zhí)行下條指令。
    6) RET指令用來從一個(gè)函數(shù)或過程返回,之前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ù)或者過程的棧框架,即相當(dāng)于以下兩條指令:
        movl ebp esp
        popl  ebp

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

    這些語句就是用來創(chuàng)建和釋放一個(gè)函數(shù)或者過程的??蚣艿摹?br>    原來編譯器會(huì)自動(dòng)在函數(shù)入口和出口處插入創(chuàng)建和釋放??蚣艿恼Z句。
    函數(shù)被調(diào)用時(shí):
    1) EIP/EBP成為新函數(shù)棧的邊界
    函數(shù)被調(diào)用時(shí),返回時(shí)的EIP首先被壓入堆棧;創(chuàng)建棧框架時(shí),上級(jí)函數(shù)棧的EBP被壓入堆棧,與EIP一道行成新函數(shù)棧框架的邊界
    2) EBP成為??蚣苤羔楽FP,用來指示新函數(shù)棧的邊界
    ??蚣芙⒑螅珽BP指向的棧的內(nèi)容就是上一級(jí)函數(shù)棧的EBP,可以想象,通過EBP就可以把層層調(diào)用函數(shù)的棧都回朔遍歷一遍,調(diào)試器就是利用這個(gè)特性實(shí)現(xiàn) backtrace功能的
    3) ESP總是作為棧指針指向棧頂,用來分配棧空間
    棧分配空間給函數(shù)局部變量時(shí)的語句通常就是給ESP減去一個(gè)常數(shù)值,例如,分配一個(gè)整型數(shù)據(jù)就是 ESP-4
    4) 函數(shù)的參數(shù)傳遞和局部變量訪問可以通過SFP即EBP來實(shí)現(xiàn)
    由于??蚣苤羔樣肋h(yuǎn)指向當(dāng)前函數(shù)的?;刂?,參數(shù)和局部變量訪問通常為如下形式:
        +8+xx(%ebp)         ; 函數(shù)入口參數(shù)的的訪問
        -xx(%ebp)           ; 函數(shù)局部變量訪問
           
    假如函數(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新分配的局部變量,局部變量可以通過A的ebp-偏移量A訪問
| 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訪問
| +-------------------------+ +--> 偏移量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é)果中剩余部分語句的含義:
       
    # 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       ; 通過ESP-8來分配8字節(jié)堆??臻g
    main+6:       andl    $0xf0,%esp    ; 使棧地址16字節(jié)對(duì)齊
    main+9:       movl    $0,%eax       ; 無意義
    main+0xe:     subl    %eax,%esp     ; 無意義
    main+0x10:     movl    $0,%eax          ; 設(shè)置main函數(shù)返回值
    main+0x15:     leave                    ; 撤銷Stack Frame(棧框架)
    main+0x16:     ret                      ; main 函數(shù)返回
    >

    以下兩句似乎是沒有意義的,果真是這樣嗎?
        movl    $0,%eax
        subl     %eax,%esp
      
    用gcc的O2級(jí)優(yōu)化來重新編譯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異或指令來使eax為0
    main+0xb:     leave
    main+0xc:     ret
    >
    新的反匯編結(jié)果比最初的結(jié)果要簡潔一些,果然之前被認(rèn)為無用的語句被優(yōu)化掉了,進(jìn)一步驗(yàn)證了之前的猜測(cè)。
    提示:編譯器產(chǎn)生的某些語句可能在程序?qū)嶋H語義上沒有用處,可以用優(yōu)化選項(xiàng)去掉這些語句。

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

    概念:Stack aligned 棧對(duì)齊
    那么,以下語句到底是和作用呢?
        subl    $8,%esp
       andl    $0xf0,%esp     ; 通過andl使低4位為0,保證棧地址16字節(jié)對(duì)齊
      
    表面來看,這條語句最直接的后果是使ESP的地址后4位為0,即16字節(jié)對(duì)齊,那么為什么這么做呢?
    原來,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??磥恚@也是為保證棧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的,也就是說,默認(rèn)情況下,gcc是16字節(jié)對(duì)齊,以適應(yīng)IA32大多數(shù)指令的要求。

    讓我們利用-mpreferred-stack-boundary=2來去除棧對(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ì)齊指令沒有了,因?yàn)椋琁A32的棧本身就是4字節(jié)對(duì)齊的,不需要用額外指令進(jìn)行對(duì)齊。
    那么,??蚣苤羔楽FP是不是必須的呢?
    # 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。
      
    問題:去除SFP后有什么缺點(diǎn)呢?
      
    1)增加調(diào)式難度
        由于SFP在調(diào)試器backtrace的指令中被使用到,因此沒有SFP該調(diào)試指令就無法使用。
    2)降低匯編代碼可讀性
        函數(shù)參數(shù)和局部變量的訪問,在沒有ebp的情況下,都只能通過+xx(esp)的方式訪問,而很難區(qū)分兩種方式,降低了程序的可讀性。
      
    問題:去除SFP有什么優(yōu)點(diǎn)呢?
      
    1)節(jié)省棧空間
    2)減少建立和撤銷??蚣艿闹噶詈螅喕舜a
    3)使ebp空閑出來,使之作為通用寄存器使用,增加通用寄存器的數(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ì)以上問題作出了規(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)制程序的功能。
    詳見文章:
關(guān)注: Solaris 10的10大新變化
            
3. 小結(jié)
    本文通過最簡的C程序,引入以下概念:
        SFP 棧框架指針
        Stack aligned 棧對(duì)齊
        Calling Convention  調(diào)用約定 和 ABI (Application Binary Interface) 應(yīng)用程序二進(jìn)制接口
    今后,將通過進(jìn)一步的實(shí)驗(yàn),來深入了解這些概念。通過掌握這些概念,使在匯編級(jí)調(diào)試程序產(chǎn)生的core dump、掌握C語言高級(jí)調(diào)試技巧成為了可能。


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

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

    list

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

    list -

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

    list n

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

    list function

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

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

    forward/search 字符串

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

 * 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:啟動(dòng)程序,在run后面帶上參數(shù)可以傳遞給正在調(diào)試的程序。

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

    awatch 變量或表達(dá)式

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

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

    watch 變量或表達(dá)式

  需要注意的是,awatch和watch都必須在程序運(yùn)行的過程中設(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)之間用空格間隔開。

 * 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

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

    cont n

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

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

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

    jump 行號(hào)

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

    next

      執(zhí)行一條語句

    next n

      執(zhí)行n條語句

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

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

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

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

    whatis 變量或表達(dá)式

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

    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來顯示棧幀信息。使用格式:

    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://m.shnenglu.com/liu1061/articles/53232.htmlT.S LiuT.S LiuSat, 14 Jun 2008 05:37:00 GMThttp://m.shnenglu.com/liu1061/articles/53232.htmlhttp://m.shnenglu.com/liu1061/comments/53232.htmlhttp://m.shnenglu.com/liu1061/articles/53232.html#Feedback0http://m.shnenglu.com/liu1061/comments/commentRss/53232.htmlhttp://m.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)用是緩式的,也就是說只有當(dāng)變量真正需要時(shí)才會(huì)被計(jì)算。
int c = add(1,1)
printf("%d",c);

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

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

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

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

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)用棧幀。該命令可用來顯示函數(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ù)名稱。
  info local 顯示當(dāng)函數(shù)中的局部變量信息。
  info prog 顯示被調(diào)試程序的執(zhí)行狀態(tài)。
  info var 顯示所有的全局和靜態(tài)變量名稱。
  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)開始繼續(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)開始運(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++類)的內(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ù)類型

T.S Liu 2008-06-14 13:37 發(fā)表評(píng)論
]]>
ubuntu linux base comandhttp://m.shnenglu.com/liu1061/articles/52223.htmlT.S LiuT.S LiuThu, 05 Jun 2008 02:14:00 GMThttp://m.shnenglu.com/liu1061/articles/52223.htmlhttp://m.shnenglu.com/liu1061/comments/52223.htmlhttp://m.shnenglu.com/liu1061/articles/52223.html#Feedback0http://m.shnenglu.com/liu1061/comments/commentRss/52223.htmlhttp://m.shnenglu.com/liu1061/services/trackbacks/52223.htmlNO   分類   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文件名   分頁查看文件內(nèi)容         
6  文件管理   #   less   less 文件名   可控分頁查看文件內(nèi)容         
7  文件管理   #   grep   grep字符 文件名   根據(jù)字符匹配來查看文件部分內(nèi)容         
8  文件管理   #   mv   mv 路經(jīng)/文件  /經(jīng)/文件   移動(dòng)相對(duì)路經(jīng)下的文件到絕對(duì)路經(jīng)下          
   文件管理   #   mv   mv 文件名 新名稱   在當(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 磁盤管理   #   df   df   用于報(bào)告文件系統(tǒng)的總?cè)萘浚褂昧?,剩余容量?nbsp;        
15 磁盤管理   #   du   du -b /home   查看目前/HOME目錄的容量(k)及子目錄的容量(k)。         
16 磁盤管理   #   fdisk   fdisk -l   查看系統(tǒng)分區(qū)信息      
17 磁盤管理   #   fdisk   fdisk /dev/sdb   為一塊新的SCSI硬盤進(jìn)行分區(qū)      
18 磁盤管理   #   mkfs.ext3   Mkfs.ext3 /dev/sdb1
                  為第一塊SCSI硬盤的第一主分區(qū)格式化成ext3的文件系統(tǒng)      
                  mkfs.ext2   Mkfs.ext2/dev/sdb2    格式化成ext2文件系統(tǒng)      
19 磁盤管理   #   mount   mount -t 文件系統(tǒng)類型 設(shè)備路經(jīng)  訪問路經(jīng)         
   磁盤管理   #   文件系統(tǒng)類型            
                  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 磁盤管理   #   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的其它用戶加上寫權(quán)限         
                  chmod a-x file   為file的所有用戶減去執(zhí)行權(quán)限      
                  chmod 765 file  為file的屬主設(shè)為完全權(quán)限,屬組設(shè)成讀寫權(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用戶名   查詢賬號(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   查詢已安裝RPM         
45   軟件管理   #   rpm –qa | grep ftp   查詢指定RPM         
46   軟件管理   #   rpm -q   rpm -q 已安裝的RPM包   查是否安裝         
47   軟件管理   #   rpm -q telnet-server   查看telnet服務(wù)器包      
48   軟件管理   #   rpm -qi   rpm –qi 軟件包名稱   查看軟件的描述信息      
49   軟件管理   #   rpm -ql   rpm –ql軟件包名稱   查詢軟件包的文件列表      
50   軟件管理   #   rpm -qf   rpm –qf軟件包名稱   查詢某個(gè)文件所屬的軟件包      
51   軟件管理   #   rpm -qp   rpm –qp軟件包全名   查詢未安裝的軟件包信息      
52   軟件管理   #   rpm -e   rpm –e 軟件包名稱   刪除具體的軟件包      
53   軟件管理   #   rpm -U   rpm –Uvh軟件包全名   升級(jí)軟件包并顯示過程      
54   軟件管理   #   rpm -ivh   rpm –ivh 軟件包全名   安裝軟件包并顯示過程      
55   軟件管理   #   rpm -V   rpm –V軟件包名稱   驗(yàn)證軟件包的大小,類型等      
56   軟件管理   #   tar    -c 創(chuàng)建包 –x 釋放包  -v 顯示命令過程 –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ù)名稱]   查看服務(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)程樹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的形式來編輯自動(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)磁盤配額   (注安裝LINUX時(shí)建立/home分區(qū))
目標(biāo):對(duì)用戶zhao在/home目錄上實(shí)現(xiàn)soft limit為5k,hard limit 為10k的磁盤配額
實(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.開啟/home上的磁盤配額功能                 #quotaon /home
13.查詢配額                                #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://m.shnenglu.com/liu1061/articles/52174.htmlT.S LiuT.S LiuWed, 04 Jun 2008 08:44:00 GMThttp://m.shnenglu.com/liu1061/articles/52174.htmlhttp://m.shnenglu.com/liu1061/comments/52174.htmlhttp://m.shnenglu.com/liu1061/articles/52174.html#Feedback0http://m.shnenglu.com/liu1061/comments/commentRss/52174.htmlhttp://m.shnenglu.com/liu1061/services/trackbacks/52174.html如何列出硬盤分割表?
sudo fdisk -l
  • 您可以使用 系統(tǒng) -> 管理 -> Disks

[編輯] 如何列出硬盤檔案系統(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ǔ)存編輯過的檔案

[編輯] 如何手動(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

[編輯] 如何不用重開機(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 光盤制作程序 : 檔案瀏覽器
  • 拖曳 檔案/資料夾 至窗口內(nèi)
檔案選單 -> 燒錄光盤... -> 燒錄

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

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

[編輯] 如何復(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

[編輯] 如何不透過燒錄而 掛載/卸載 影像檔 (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
  • 開始連線
sudo pon provider_name
  • 結(jié)束連線
sudo poff

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

sudo pppoeconf

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

  • 請(qǐng)參閱 #基本備注
  • 系統(tǒng) -> 管理 -> 網(wǎng)絡(luò)
  • 網(wǎng)絡(luò)設(shè)定
一般 -> 主機(jī)設(shè)定 -> 主機(jī)名稱: 指定計(jì)算機(jī)名稱
  • 儲(chǔ)存并且關(guān)閉所有已開啟的應(yīng)用程序,并重開機(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ǔ)存編輯過的檔案
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ǔ)存編輯過的檔案
sudo testparm
sudo /etc/init.d/samba restart

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

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ǔ)存編輯過的檔案
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ǔ)存編輯過的檔案

[編輯] 如何簡單分享資料夾?

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

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

e.g. 假設(shè)局域網(wǎng)路已經(jīng)設(shè)定好了
如果計(jì)算機(jī)或者網(wǎng)絡(luò)資料夾無法找到,試著接存取他們。
請(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
分享出來的資料夾名稱是: 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
分享資料夾名稱: 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ò)共享檔案夾, 并允許所有使用者都可讀取和寫入?

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
分享資料夾名稱: 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
分享資料夾名稱: linux
本機(jī)掛載資料夾: /media/sharename
sudo mkdir /media/sharename
sudo gedit /root/.smbcredentials
  • 在新增的檔案內(nèi)加入下面這幾行
username=myusername
password=mypassword
  • 儲(chǔ)存編輯過的檔案
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
分享資料夾名稱: linux
本機(jī)掛載資料夾: /media/sharename
sudo mkdir /media/sharename
sudo gedit /root/.smbcredentials
  • 在新增的檔案內(nèi)加入下面這幾行
username=myusername
password=mypassword
  • 儲(chǔ)存編輯過的檔案
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ǎng)絡(luò)模組(ipw2200)并且使用無線資料傳輸協(xié)定(WAP)?

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

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

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

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

e.g. Assumed that remote Ubuntu machine have configured Remote Desktop
Read #如何設(shè)定遠(yuǎn)端桌面 (沒有安全性)?
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)端桌面 (沒有安全性)?
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) , 并且允許所有使用者能讀取以及寫入?

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/

[編輯] 如何開機(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

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

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://m.shnenglu.com/liu1061/articles/51895.htmlT.S LiuT.S LiuMon, 02 Jun 2008 09:09:00 GMThttp://m.shnenglu.com/liu1061/articles/51895.htmlhttp://m.shnenglu.com/liu1061/comments/51895.htmlhttp://m.shnenglu.com/liu1061/articles/51895.html#Feedback0http://m.shnenglu.com/liu1061/comments/commentRss/51895.htmlhttp://m.shnenglu.com/liu1061/services/trackbacks/51895.html閱讀全文

]]>
gcc和g++的區(qū)別http://m.shnenglu.com/liu1061/articles/51872.htmlT.S LiuT.S LiuMon, 02 Jun 2008 04:37:00 GMThttp://m.shnenglu.com/liu1061/articles/51872.htmlhttp://m.shnenglu.com/liu1061/comments/51872.htmlhttp://m.shnenglu.com/liu1061/articles/51872.html#Feedback0http://m.shnenglu.com/liu1061/comments/commentRss/51872.htmlhttp://m.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++,于是各種說法都來了,譬如c代碼用gcc,而c++代碼用g++,或者說編譯用 gcc,鏈接用g++,一時(shí)也不知哪個(gè)說法正確,如果再遇上個(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ì)語法的要求是有區(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的語法規(guī)則,OK,沒問題,但是,一旦把后綴改為cpp,立刻報(bào)三個(gè)錯(cuò):“printString未定義”;
“cannot convert `char**' to `char*”;
”return-statement with no value“;
分別對(duì)應(yīng)前面紅色標(biāo)注的部分。可見C++的語法規(guī)則更加嚴(yán)謹(jǐn)一些。
2.編譯階段,g++會(huì)調(diào)用gcc,對(duì)于c++代碼,兩者是等價(jià)的,但是因?yàn)間cc命令不能自動(dòng)和C++程序使用的庫聯(lián)接,所以通常用g++來完成鏈接,為了統(tǒng)一起見,干脆編譯/鏈接統(tǒng)統(tǒng)用g++了,這就給人一種錯(cuò)覺,好像cpp程序只能用g++似的。
誤區(qū)二:gcc不會(huì)定義__cplusplus宏,而g++會(huì)

實(shí)際上,這個(gè)宏只是標(biāo)志著編譯器將會(huì)把代碼按C還是C++語法來解釋,如上所述,如果后綴為.c,并且采用gcc編譯器,則該宏就是未定義的,否則,就是已定義。
誤區(qū)三:編譯只能用gcc,鏈接只能用g++

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

實(shí)際上并無關(guān)系,無論是gcc還是g++,用extern "c"時(shí),都是以C的命名方式來為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é)論】完全相同,可見extern "C"與采用gcc/g++并無關(guān)系,以上的試驗(yàn)還間接的印證了前面的說法:在編譯階段,g++是調(diào)用gcc的。


]]>
gcc/g++ 常用選項(xiàng)http://m.shnenglu.com/liu1061/articles/51870.htmlT.S LiuT.S LiuMon, 02 Jun 2008 04:32:00 GMThttp://m.shnenglu.com/liu1061/articles/51870.htmlhttp://m.shnenglu.com/liu1061/comments/51870.htmlhttp://m.shnenglu.com/liu1061/articles/51870.html#Feedback0http://m.shnenglu.com/liu1061/comments/commentRss/51870.htmlhttp://m.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)換成匯編語言,生成文件.s[編譯器egcs]
3.有匯編變?yōu)槟繕?biāo)代碼(機(jī)器代碼)生成.o的文件[匯編器as]
4.連接目標(biāo)代碼,生成可執(zhí)行程序[鏈接器ld]
[參數(shù)詳解]
-x language filename
設(shè)定文件所使用的語言,使后綴名無效,對(duì)以后的多個(gè)有效.也就是根據(jù)約定C語言的后
綴名稱是.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í)別文件類型
例子用法:
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)名稱,缺省的時(shí)候,gcc 編譯出來的文件是a.out,很難聽,如果你和我有同感
,改掉它,哈哈
例子用法
gcc -o hello.exe hello.c (哦,windows用習(xí)慣了)
gcc -o hello.asm -S hello.c
-pipe
使用管道代替編譯中臨時(shí)文件,在使用非gnu匯編工具的時(shí)候,可能有些問題
gcc -pipe -o hello.exe hello.c
-ansi
關(guān)閉gnu c中與ansi c不兼容的特性,激活ansi c的專有特性(包括禁止一些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)為是沒有顯式的對(duì)參數(shù)
的個(gè)數(shù)和類型說明,而不是沒有參數(shù).
而gcc無論是否使用這個(gè)參數(shù),都將對(duì)沒有帶參數(shù)的函數(shù),認(rèn)為城沒有顯式說明的類型


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

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

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

-include file
包含某個(gè)代碼,簡單來說,就是便以某個(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語言中的#define macro

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

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

-Idir
在你是用#i nclude"file"的時(shí)候,gcc/g++會(huì)先在當(dāng)前目錄查找你所制定的頭文件,如
果沒有找到,他回到缺省的頭文件目錄找,如果使用-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++庫
使用

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


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

-MM
和上面的那個(gè)一樣,但是它將忽略由#i nclude<file>造成的依賴關(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í)候使用的庫
例子用法
gcc -lcurses hello.c
使用ncurses庫編譯程序

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

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

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

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

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


]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            91久久香蕉国产日韩欧美9色| 狠狠色丁香久久综合频道| 亚洲精品免费网站| 亚洲电影观看| 日韩午夜激情av| 亚洲性xxxx| 欧美怡红院视频| 久久精品一区二区三区中文字幕 | 性伦欧美刺激片在线观看| 亚洲午夜一区二区| 久久国产精品99国产| 久久久蜜桃精品| 欧美激情中文字幕一区二区 | 在线欧美福利| 日韩一级免费| 午夜久久资源| 免费看亚洲片| 亚洲天堂视频在线观看| 亚洲欧美久久久久一区二区三区| 久久久xxx| 欧美高清视频免费观看| 亚洲人人精品| 亚洲级视频在线观看免费1级| 亚洲精品久久久久中文字幕欢迎你| 日韩亚洲在线| 久久国内精品视频| 欧美日韩久久| 亚洲成人在线网| 香蕉av777xxx色综合一区| 欧美成人精品激情在线观看| 亚洲天堂av图片| 免费看av成人| 国产一区在线免费观看| 亚洲欧美高清| 欧美电影电视剧在线观看| 国产精品一区二区久久久| 亚洲卡通欧美制服中文| 欧美自拍偷拍| 亚洲美女网站| 欧美激情一区二区三区不卡| 影音先锋亚洲电影| 欧美在线视频在线播放完整版免费观看 | 国产精品天美传媒入口| 亚洲精品国产品国语在线app| 久久精品欧洲| 亚洲影院色无极综合| 欧美黄污视频| 亚洲国产精品高清久久久| 久久大香伊蕉在人线观看热2| 9久草视频在线视频精品| 欧美xart系列在线观看| 亚洲高清久久久| 免费不卡中文字幕视频| 久久精品人人做人人爽电影蜜月| 国产欧美精品久久| 午夜精品视频网站| 亚洲一区二区在线观看视频| 欧美日韩在线亚洲一区蜜芽 | 国产精品视频导航| 午夜精品福利电影| 亚洲天堂成人| 国产啪精品视频| 欧美有码在线视频| 午夜精品亚洲| 国产专区欧美精品| 久久尤物视频| 六月婷婷久久| 日韩午夜在线视频| 亚洲精品资源美女情侣酒店| 欧美99在线视频观看| 久久久久青草大香线综合精品| 国产综合久久久久影院| 久久婷婷丁香| 免费的成人av| 在线综合+亚洲+欧美中文字幕| 亚洲欧洲日产国码二区| 欧美日韩精品免费观看视一区二区| 亚洲婷婷在线| 香蕉国产精品偷在线观看不卡| 玉米视频成人免费看| 国产日韩亚洲欧美精品| 久久精品国内一区二区三区| 欧美一区在线直播| 亚洲激情电影中文字幕| 亚洲人成网站精品片在线观看 | 久久久美女艺术照精彩视频福利播放| 欧美在线免费视频| 亚洲日本理论电影| 一区二区欧美亚洲| 好吊一区二区三区| 亚洲精品国产欧美| 国产欧美va欧美va香蕉在| 欧美黄色一区二区| 国产精品久久久久av| 久久亚洲精品欧美| 欧美日本在线播放| 久久久免费av| 国产精品精品视频| 亚洲第一级黄色片| 国产精品久久久久久久久免费桃花| 久久精品久久99精品久久| 欧美成人综合| 久久久亚洲国产天美传媒修理工| 欧美日韩一区二区三区四区五区| 久久成人一区| 欧美日韩成人一区二区| 久热国产精品| 国产精品日韩欧美综合| 亚洲国产精品久久| 国产视频欧美| 一区二区av在线| 亚洲激情在线| 久久精品噜噜噜成人av农村| 亚洲一区二区免费| 欧美不卡视频一区| 美女网站久久| 国产日韩欧美不卡| 亚洲图片你懂的| aa级大片欧美| 免费观看欧美在线视频的网站| 久久精品女人| 国产欧美日韩亚洲精品| 一区二区三欧美| 一区二区三区日韩| 欧美精品粉嫩高潮一区二区 | 亚洲国产天堂久久综合网| 亚洲欧美偷拍卡通变态| 亚洲香蕉伊综合在人在线视看| 欧美激情综合| 亚洲一区在线观看视频| 麻豆精品一区二区av白丝在线| 午夜久久福利| 国产精品日韩欧美大师| 一本大道久久a久久综合婷婷| 亚洲精品亚洲人成人网| 麻豆久久精品| 亚洲第一精品久久忘忧草社区| 亚洲经典自拍| 欧美高清自拍一区| 亚洲高清久久| 日韩一区二区免费高清| 欧美精品日韩精品| 亚洲最快最全在线视频| 亚洲欧美日韩视频一区| 国产精品乱人伦一区二区| 亚洲一区尤物| 久久亚洲精品视频| 亚洲第一在线综合在线| 蜜月aⅴ免费一区二区三区| 欧美激情一区二区三级高清视频| 亚洲激情视频在线| 欧美日本在线看| 亚洲欧美综合网| 久久精品99国产精品日本| 国产一区欧美日韩| 老司机一区二区三区| 亚洲第一精品久久忘忧草社区| 一区二区av在线| 国产精品日本一区二区| 欧美一区激情视频在线观看| 免费精品99久久国产综合精品| 亚洲伦伦在线| 国产精品有限公司| 久久久久久久97| 亚洲三级视频在线观看| 欧美在线综合视频| 亚洲黄色免费网站| 欧美视频一区在线| 久久av一区| 亚洲精品国产精品乱码不99按摩| 亚洲欧美日韩国产成人精品影院| 国内精品久久久久久久影视蜜臀| 欧美大胆a视频| 香蕉久久a毛片| 亚洲黄网站黄| 久久精品在线| 国产精品99久久久久久久vr| 国产婷婷精品| 欧美日韩在线视频观看| 久久另类ts人妖一区二区| 一区二区三区视频在线播放| 久久综合久久久久88| 亚洲一区免费观看| 亚洲电影成人| 国产欧美日韩精品一区| 欧美精品系列| 久久久欧美精品| 99精品热视频| 激情综合色综合久久综合| 欧美视频在线看| 欧美成人高清视频| 久久精品99| 亚洲免费在线观看视频| 亚洲精品美女免费| 欧美大片国产精品| 久久久久青草大香线综合精品| 一本一本久久a久久精品综合麻豆| 亚洲电影免费观看高清完整版在线| 国产精品一区二区三区四区五区| 欧美人成网站|