linux程序设计基础

1.软件工具和开发资源的位置

  应用程序或开发的工具:/usr/bin

  头文件:/usr/include目录及其子目录

  库文件:/lib或/usr/lib

  系统配置文件:/etc

2.创建库文件

  $ ar   crv  libfoo.a  bill.o  fred.o                       //用ar程序创建一个归档文件(静态库),把两个目标文件添加进去

  $ ranlib  libfoo.a                                              //区分系统,有的系统不是必须的

  使用上述新创建的库:gcc -o program program.o libfoo.a  或  gcc -o program program.o -L. -lfoo

3.nm命令

  查看哪些函数被包含在目标文件、函数库或可执行文件里

4.ldd工具

  查看一个程序需要的共享库

  [root@localhost lib]# ldd libc.so.6
    /lib/ld-linux.so.2 (0x00544000)
    linux-gate.so.1 => (0x00b7f000)

5.家(home)目录

  进入自己家目录:cd ~

  进入别人家目录:cd ~user(~加用户名)

6.linux中比较重要的3个设备文件

  /dev/console:系统控制台

  /dev/tty:   控制终端的别名

  /dev/null:  空(null)设备。所有写向这个设备的输出都丢弃,读这个设备会立即返回一个文件尾标识

7.访问设备驱动程序的底层函数(系统调用)

  open:若调用成功,返回一个可以被read、write和其他系统调用使用的文件描述符。文件描述符是唯一的,且不能和其他运行中的进程共享。若两个程序同时打开同一个文件,则分别得到两个不同的文件描述符

  read

  write

  close:终止文件描述符filedes与其对应文件之间的关联

  ioctl:用于控制设备及其描述符行为和配置底层服务的接口

8.open系统调用

  当使用带有O_CREATE标志的open调用来创建文件,必须用3个参数格式的open调用

  int open(const char *path,int oflags,mode_t mode)

  open("myfile",O_CREATE,S_IRUSR|S_IXOTH)  创建一个名为myfile的文件,文件属主拥有读权限,其他用户有执行权限

9.umask

  是一个系统变量,作用是:当文件创建时,为文件的访问权限设定一个掩码。如果对应的位被设置为1,代表禁止对应的权限

  如umask=032(000 011 010),表示:禁止组的写和执行权限,同时禁止其他用户的写权限

10.ioctl系统调用

  int ioctl(int filedes,int cmd,...)

  在Linux系统上,打开键盘上的LED灯:

  ioctl(tty_fd,KDSETLED,LED_NUM|LED_CAP|LED_SCR)

11.time工具对程序运行时间测算

  [root@localhost helloworld]# TIMEFORMAT="" time ./helloworld
  Waiting for thread to finish...
  thread_function is running. Argument was Hello World
  Thread joined, it returned Thank you for your CPU time!
  Message is now Bye!
  0.00user 0.00system 0:03.00elapsed 0%CPU (0avgtext+0avgdata 2640maxresident)k
  0inputs+0outputs (0major+203minor)pagefaults 0swaps

12.procfs

  linux中一种特殊的文件系统,通常以/proc目录形式呈现

13.mmap函数

  作用:建立一段可以被两个或更多个程序读写的内存。

  配套的:mmap() msync() munmap()

14.文件锁定

  linux提供了多种特性实现文件锁定,其中最简单的方法就是以原子操作的方式创建锁文件

  创建锁文件,可以使用open系统调用,并带上O_CREATE和O_EXCL标志

  O_EXCL标志作用:1)防止两个程序同时创建同一个文件 2)如果文件存在,open调用返回失败

 1 #include <unistd.h>
 2 #include <stdlib.h>
 3 #include <stdio.h>
 4 #include <fcntl.h>
 5 #include <errno.h>
 6 
 7 const char *lockfile = "/home/gqx0001100627/study/lock/LCK.test";
 8 
 9 int main()
10 {
11     int fd;
12     int tries = 10;
13     
14     while(tries--){
15         fd = open(lockfile,O_RDWR|O_CREAT|O_EXCL,0444);
16         if(-1 == fd){
17             printf("%d - Lock already present\n",getpid());
18             sleep(3);
19         }
20         else{
21             printf("%d - I have exclusive access \n",getpid());
22             sleep(1);
23             (void)close(fd);
24             (void)unlink(lockfile);
25             
26             sleep(2);
27         }
28     }
29     
30     exit(EXIT_SUCCESS);
31 }

 15.区域锁定

  锁定文件的区域,文件中的某个特定部分被锁定了,但其他程序可以访问这个文件中的其他部分。也叫文件段锁定或文件区域锁定。

  linux有两种方法来实现这个功能:使用fcntl系统调用和使用lockf系统调用。fcntl比较常用。

  #include <fcntl.h>

  int fcntl(int fildes,int command,...)

  command有三个可用于文件锁定的命令项:

  F_GETLK

  F_SETLK

  F_SETLKW

  当使用这些命令时,fcntl的第三个参数是指向flock结构的指针

  int fcntl(int fildes,int command,struct flock* flock_structure)

16.文件中的每个字节在任一时刻只能拥有一种类型的锁:共享锁、独占锁或解锁

17.锁定状态下的读写操作

  当对文件区域加锁之后,你必须使用底层的read和write调用来访问文件中的数据,而不要使用更高级的fread和fwrite调用,这是因为fread和fwrite会对读写的数据进行缓存,所以执行一次fread调用来读取文件中的头100个字节可能会读取超过100字节的数据,并将多余的数据在函数库中进行缓存。如果程序再次使用fread来读取下100个字节的数据,他实际上将读取已缓存在函数库中的数据。

18.常用调试技巧

  /*定义一个全局变量 debug */

  if(debug){

    sprintf(msg,...);

    write_debug(msg)

  }

  #if DEBUG

    printf(" something ");

  #endif

19.

  __LINE__    行号

  __FILE__    文件名

  __DATE__   mm dd yyyy

  __TIME__   hh mm ss

20. -g选项

  -g 标志是对程序进行调试性编译试常用的一个选项

21.调试信息的加入将使可执行程序的长度成倍增加。尽管可执行程序的容量可能增加了(占用了更多的磁盘空间),但程序运行时所需要的内存数量还是和原来一样

  可以使用strip <file> 将可执行文件中的调试信息删除而不需要重新编译程序

22. gdb

  run

  backtrace(简写bt) 或 where :栈跟踪

  print :打印变量值

    print array[0]@5 :打印出一组连续的数据项,本例就是 打印出array数组中5个数据元素

    dispay array[0]@5 :每次程序停在断点位置时,自动显示数组的内容 

  list :列出程序源代码

  break :设置断点

  commands:作用是指定在程序到达断点位置时需要执行的调试器命令.

  disable break 1:禁用断点

  disable display 1 

 

  用调试器打补丁:  set variable n=n+1

  例:commands 2       2是断点号

    >set variable n=n+1

       >cont

    >end

  gdb可以用来调试已经崩溃的程序,程序运行失败时,linux系统通常会产生一个核心转储(core dump),并将它保存在core文件中。core文件是一个内存镜像文件,它包含运行失败的那个时刻的全局变量取值,可以通过gdb找出程序发生崩溃的位置。

at 1808  进程号
thread apply all bt 查看所有线程的堆栈内容
Thread num 查看某线程的堆栈内容
f num 进入函数调用栈的某一层
p 变量名  查看变量的值

b 设置断点(b 函数名/b 文件名:行号)
d b 删除断点
c 继续运行
p                           打印
s(step)                    单步跟踪(进入函数)
n(next)                    单步跟踪(不进入函数)
finish                     运行程序直到函数完成返回
u(until)                   运行程序直到退出循环
bt                          查看调用栈
thread                      进入线程
f                           进入函数调用栈某一层
info                        显示相应信息,如info b就是显示断点信息,info local就是显示函数中局部变量的值
quit                        退出

23.内存调试工具

  electricfence,当发现内存被破坏时就停止程序运行

  valgrind 可以检测出数组访问错误和内存泄露

  

转载于:https://www.cnblogs.com/qxgloyal/p/8604116.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值