Linux,interesting and enjoyable

作者:林海枫
网址: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的文件,内容如下:


  1. #include <stdlib.h>
  2. int main()
  3. {
  4.     int *ptr = NULL;
  5.     ptr = (int *)malloc(sizeof(int));
  6.     *ptr = 5;
  7.     free(ptr);
  8.     return 0;
  9. }
你想知道它生成对应的汇编吗?

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

  1.         .file   "test_malloc.c"
  2.         .text
  3. .globl main
  4.         .type   main, @function
  5. main:
  6.         leal    4(%esp), %ecx
  7.         andl    $-16, %esp
  8.         pushl   -4(%ecx)
  9.         pushl   %ebp
  10.         movl    %esp, %ebp
  11.         pushl   %ecx
  12.         subl    $20, %esp
  13.         movl    $0, -8(%ebp)
  14.         movl    $4, (%esp)
  15.         call    malloc
  16.         movl    %eax, -8(%ebp)
  17.         movl    -8(%ebp), %eax
  18.         movl    $5, (%eax)
  19.         movl    -8(%ebp), %eax
  20.         movl    %eax, (%esp)
  21.         call    free
  22.         movl    $0, %eax
  23.         addl    $20, %esp
  24.         popl    %ecx
  25.         popl    %ebp
  26.         leal    -4(%ecx), %esp
  27.         ret
  28.         .size   main, .-main
  29.         .ident  "GCC: (GNU) 4.1.2 (Ubuntu 4.1.2-0ubuntu4)"
  30.         .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团队期待您的参与。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值