作者:林海楓
網址:http://blog.csdn.net/linyt/archive/2008/09/16/2938122.aspx
[注]:本文著作權由作者擁有,歡迎轉載,但請完整轉載,請匆用於商業用途
對於一個從window走過來的入門者,只使用命令來操作是一件很無聊的事情。因為剛開始不太可能就接觸linux下的C編程或者指令碼,又沒有工作的需要,確實不知剛學什麼命令,而且也不知學來做什麼。所以學習linux第一步是要找到方向和動力!為了加速大家的動力,我先寫幾個命令讓大家看看linux對於程式員或酷愛技術的朋友感受一下linux的好處!
1.記當讀大三的時候,找一本OS實驗的書,上面有一個用C語言的代碼,用於讀取硬碟的分區表;然而在linux只需一個命令就可以了:
dd if =/dev/hda of=/tmp/mbr bs=512 count=1
運行完成後,檔案/tmp/mbr是硬碟主引導記錄,為512位元組,前446是OS代碼,後64位元組包含分區表資訊,最後2位元組標識是MBR. 然後用od命令就可以查看/tmp/mbr檔案是第447到510位元組的內容了,它就是分區表的內容。
2.你喜歡在C語言程式嗎?
我們就來一個吧
用vi來編輯一個叫test_malloc.c的檔案,內容如下:
- #include <stdlib.h>
- int main()
- {
- int *ptr = NULL;
- ptr = (int *)malloc(sizeof(int));
- *ptr = 5;
- free(ptr);
- return 0;
- }
你想知道它產生對應的彙編嗎?
ylin@ylin:~/program/c$ gcc -S test_malloc.c <---這個命令從test_malloc.c產生對應的彙編檔案test_malloc.s
ylin@ylin:~/program/c$ cat test_malloc.s <--彙編如下,這個中AT&T格式的編程,而不是我們所學的Masm格式,但對應的指令都一樣
的!
ylin@ylin:~/program/c/test$ cat test_malloc.s
- .file "test_malloc.c"
- .text
- .globl main
- .type main, @function
- main:
- leal 4(%esp), %ecx
- andl $-16, %esp
- pushl -4(%ecx)
- pushl %ebp
- movl %esp, %ebp
- pushl %ecx
- subl $20, %esp
- movl $0, -8(%ebp)
- movl $4, (%esp)
- call malloc
- movl %eax, -8(%ebp)
- movl -8(%ebp), %eax
- movl $5, (%eax)
- movl -8(%ebp), %eax
- movl %eax, (%esp)
- call free
- movl $0, %eax
- addl $20, %esp
- popl %ecx
- popl %ebp
- leal -4(%ecx), %esp
- ret
- .size main, .-main
- .ident "GCC: (GNU) 4.1.2 (Ubuntu 4.1.2-0ubuntu4)"
- .section .note.GNU-stack,"",@progbits
看了上面的代碼,你會擔心,如果malloc函數不成功(返回NULL)會如何呢?或許無論你運行多少次,可能找不到上面malloc返回NULL的情況!
你想知道上面返回NULL後出現什麼情況嗎? Linux下有一個優秀的調試器可以幫你類比這些情況的出現。讓我們來看看吧。
1).先產生一個可調試檔案
ylin@ylin:~/program/c/test$ gcc -Wall -g -o test_malloc test_malloc.c
2). 使用gdb進行調試
ylin@ylin:~/program/c/test$ gdb ./test_malloc -q
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) l <---這個是list命令的縮寫,用於邊調試邊查看原始碼
1 #include <stdlib.h>
2
3 int main()
4 {
5 int *ptr = NULL;
6
7 ptr = (int *)malloc(sizeof(int));
8 *ptr = 5;
9
10 free(ptr);
(gdb) l <-------同上
11
12 return 0;
13 }
(gdb) break main <-----在main函上設定斷點,當執行到main函數時會停止
Breakpoint 1 at 0x80483c5: file test_malloc.c, line 5.
(gdb) r <-----先讓程式運行起來
Starting program: /home/ylin/program/c/test/test_malloc
Breakpoint 1, main () at test_malloc.c:5 <------系統提示,執行到main斷點了
5 int *ptr = NULL;
(gdb) n <------next命令的縮寫,逐步執行,即執行int *ptr = NULL;這個語句, ptr = (int *)malloc(sizeof(int));下一條要執行的句
7 ptr = (int *)malloc(sizeof(int));
(gdb) n <-----逐步執行
8 *ptr = 5;
(gdb) print ptr <------查看ptr的值,以及它指向的記憶體單元
$1 = (int *) 0x804a008
(gdb) call free(ptr) <------在調試器中調用庫函數free
$2 = 0
(gdb) set var ptr = 0 <------設定變數ptr的值為NULL,這兩步是類比malloc函數返回NULL的情況
(gdb) n <------逐步執行
Program received signal SIGSEGV, Segmentation fault. <-----調試器提示:程式訪問非法內容,這裡是訪問為0內容,在linux裡非法訪存會產生一個SIGSEGV訊號。
0x080483de in main () at test_malloc.c:8
8 *ptr = 5;
(gdb) <---由於非法訪存,程式運行結束了
3.定時關機
當你正在運行一些重要程式還未結束時,不巧你有急事要走開。那linux的關機程式可以幫你完成定時關機的任務,讓你放心去做更重要的事情,用法相當簡單:
1)Shutdown –h 12:30
2)shutdown –h +30
3)shutdown –h now
1.是把關機時間定在12:30
2.是把關機時間定在30分鐘之後
3.是馬上關機,顯然這不是定時關機,不過你可以試一下這種關機方式
4.批量運行任務
你身邊有沒有同學(事)或朋友在寫php/jsp/asp的資料庫應用程呢?有的話,你可以和他開個小小的玩笑,讓他的IIS/tomcat/apache工作失效。在Linux的世界裡,這是最容易不過的事情了。假設你朋友的機器IP為192.168.1.1, web服務的連接埠為80, 訪問資料庫量最大的網頁是sreach.jsp。這樣我們採用一個稱為wget的小工具就可以。輸入下面的命令:
While [ 1 ]; do wget http://192.168.1.1/sreach.jsp; done
這樣就可以不停地向他的機器訪問sreach.jsp網頁了,如果他機器性很好,那麼你就要加多力量,讓wget並行起來。與上面的命令類,只不過複雜了點:
for I in `seq 1 1000`; do (while [ 1]; do wget http://192.168.1.1/sreash.jsp; done)& done
這就可以並發1000個使用者來訪問該面頁,並且每個使用者都是不停地訪問的。
如果對上面的用法產生興趣,那linux正是可以為你提供優質服務的作業系統,linux團隊期待您的參與。