《Linux应用程序开发(第二版)》武延军 郭松柳 译 <Linux Application Development> write by Michael K.Johnson & Erik W.Troan 序 1.推荐书籍 <The C programming Language> <Practical C programming> <Programming with GNU Software> <Advanced Programming in the UNIX Environment> <UNIX Network Programming> <A Practical Guide to Red Hat Linux 8> <Linux in a Nutshell> 2.http://ladweb.net 【{dy}章 Linux的发展历史】 Linux是一个易于移植的平台,也是一个构建和运行应用程序的平台 【第二章 许可证和版权】 {zh0}书写Copyright整个单词 example: Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc 许可证 GPL License LGPL License MIT/X/BSD License Artistic License 【第三章 在线系统文档】 man手册页 man apropos whatis[*] info手册页 info pinfo e.g. pinfo function 其他文档 /usr/share/doc 其他未分类文档的存放目录 第四章 开发工具 emacs,vi,make,gdb,strace automake autoconf libtool make ####Makefile############################# #Name: Makefile #Descr: xxx project make file #Usage: $>make all $>make clean #Author: zuohaitao #Date: yyyy-mm-dd CC=gcc CFLAG=-wall -O LDFLAG=-L. LFLAG= -lpthrad INCDFLAG=-I AR=ar ARFLAG=rcs BIN=a.out .PHONY all clean all:$(BIN) %.o:%.c $(CC) $(CFLAG) $(LDFLAG) $(INCDFLAG) -c $^ -o $@ a.out:a.o public.o $(CC) $(CFLAG) $(LDFLAG) $(INCDFLAG) $^ -o $@ clean: rm *.o rm $(BIN) ################################# gcc -MM 输出make规则 FORCE替代.PHONY的方式 clean:FORCE rm *.o rm $(BIN) make -k /bin/false /bin/true \连接两行命令 后缀规则 .c.o: $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< .SUFFIXES: .c .o gdb gcc -ggdb -c somefile.c -o someexec.out gdb someexec.out (gdb)... 1.断点 info break|watch break|delete|clear enable|disable (gdb)b 设置断点 b linenumber (gdb)n 逐过程 (gdb)s 逐句 (gdb)clear xx断点 2.执行 run|attach finish|continue|until|return next|nexti|setup|setupi (gdb)r 运行 3.查看 print|x| print 打印表达式的值 info reg disass list backtrace (gdb)l number 显示第number行 (gdb)backtrace 打印堆栈 4.其他 set|shell (gdb)set 改变变量值 第五章 gcc的选项和扩展 -o filename 输出文件名 -c 只编译不链接 -g 加入调试信息 -DMACRO=x 定义宏MACRO -static 静态链接库 -Ldir 库文件所在目录 -lname 链接名为libname.a的库文件 -Idir 头文件所在目录 -Wall 打开编译器所有有用的警告 第六章 GNU的C语言库 $sysconf_t.c打印所有系统相关信息 第七章 内存调试工具 mcheck mtrace ~$ MALLOC_TRACE=m.log gdb ./m (gdb) break main (gdb) command 1 >call mtrace() >continue >end (gdb) r mpr libefence valgrind 第八章 创建和使用库 1 产生obj文件 2 ar rcs libhlello.o libhello.a 3 gcc usehello.c -Ldir -lhello 其中 -Ldir=L../dir/ libhello.a使用lhello 第九章 Linux系统环境 一、perror() perror("open"); 二、strerror char* err = strdup(strerror(errno)); //... free(err); 三、通用错误返回代码 四、查找头文件和库文件 /usr/include /usr/lib 第十章 进程模型 一、内核跟踪的进程信息 1、程序上下文(运行的当前位置) 2、正在访问的文件 3、信用状(哪个用户、组) 4、当前目录 二、进程的属性 1、pid_t 父进程id ppid 进程标识符pid 2、信用状 A、用户ID和组ID保存在 /etc/passwd /etc/group B、uid_t 真实用户标识符(real uid)―― 运行进程的用户ID 已保存用户标识符(saved uid)―― 内核维护 没有接口进行得到或者改变 有效用户标识符(effective uid)―― 用于安全检查 可以是运行进程的用户ID 或者是文件拥有者的ID(通过设置文件标志位指定) C、补充组(supplement group) D、相关函数 uid_t ruid = geuid() //得到真实用户ID uid_t euid = geteid() //得到有效用户ID setreid(uid_t ruid, uid_t euid) //设置真实和有效用户ID 三、进程信息 1、参数 int argc=命令行参数数目 argv[0]{dy}项=程序名 argv[argc-1]{zh1}一项 argv[argc]=NULL 2、环境变量 保存在extern char* environ[]; const char* getenv(const char* name) int putenv(const char* string) //string = "NAME=VALUE" 四、创建进程 pid_t pid = fork(void) 子进程中返回0 五、等待子进程结束 pid_t wait4(pid_t pid, int* status, int options, struct rusage* rusage); wait() waitpid() wait3() 六、运行新进程 execv(const char* path, const char** argv) ... 七、进程终止 1、自我终止 exit(int exitCode) _exit(int exitCode) ateexit(void (*function)(void)) 2、其他进程终止 int kill(pid_t pid, int signum) signum = SIGTERM //体面的杀死 signum = SIGKILL //立即终止 八、简单子进程 system(const char* cmd) 九、从进程读或写 FILE* popen(const char* cmd, const char* mode) pclose(FILE* stream) 十、会话 进程组 第十一章 简单的文件管理 第十二章 信号处理 1、信号表 2、不可靠信号 typedef SIGHANDLER void (*handler(int sig_num)); int signal(int sig_num, SIGNANDLER handler); 3、可靠信号 struct { sa sa_mask; handler; }; signaction(int sig_num, struct* iact, struct* oact); 第十三章 高级文件操作 多路输入\输出 select() poll() epoll() 文件锁 最简单的文件锁 open(fd, RDONLY, 0644) open(fd, OEXECL|RDWR) 建议锁 fcntl(fd, 强制锁 第十四章 目录操作 chdir() getcwd() chroot() opendir()、readdir()、closedir() glob() ftw()、nftw() 第十五章 作业操作 第十六章 终端与伪终端 第十七章 socket网络编程 1.socket() connect() send() recv() close() 2.socket() bind() listen() while(1){accept() send() recv()} close() 3.unix域套接字 3.1.IPC通讯 3.2.类似于管道的IPC通讯 3.3.传递文件描述符 4.UDP 5.地址转换 第十八章 时间 第十九章 随机数 /gcode/src/win32/rand_matrix.c 第二十章 虚拟控制台编程 printf("\033[31mHello color world!\n\033[0m"); 颜色: 1. #define NONE "\033[m" 2. #define RED "\033[0;32;31m" 3. #define LIGHT_RED "\033[1;31m" 4. #define GREEN "\033[0;32;32m" 5. #define LIGHT_GREEN "\033[1;32m" 6. #define BLUE "\033[0;32;34m" 7. #define LIGHT_BLUE "\033[1;34m" 8. #define DARY_GRAY "\033[1;30m" 9. #define CYAN "\033[0;36m" 10. #define LIGHT_CYAN "\033[1;36m" 11. #define PURPLE "\033[0;35m" 12. #define LIGHT_PURPLE "\033[1;35m" 13. #define BROWN "\033[0;33m" 14. #define YELLOW "\033[1;33m" 15. #define LIGHT_GRAY "\033[0;37m" 16. #define WHITE "\033[1;37m" 颜色分为背景色和字体色,30~39用来设置字体色,40~49设置背景: 背景色 字体色 40: 黑 30: 黑 41: 红 31: 红 42: 绿 32: 绿 43: 黄 33: 黄 44: 蓝 34: 蓝 45: 紫 35: 紫 46: 深绿 36: 深绿 47: 白色 37: 白色 记得在打印完之后,把颜色恢复成NONE,不然再后面的打印都会跟着变色。 另外,还可以加一些ANSI控制码。加颜色只是以下控制码中的一种: \033[0m 关闭所有属性 \033[1m 设置高亮度 \033[4m 下划线 \033[5m 闪烁 \033[7m 反显 \033[8m 消隐 \033[30m -- \033[37m 设置前景色 \033[40m -- \033[47m 设置背景色 \033[nA 光标上移n行 \033[nB 光标下移n行 \033[nC 光标右移n行 \033[nD 光标左移n行 \033[y;xH设置光标位置 \033[2J 清屏 \033[K xx从光标到行尾的内容 \033[s 保存光标位置 \033[u 恢复光标位置 \033[?25l 隐藏光标 \033[?25h 显示光标 第二十一章 Linux控制台 第二十二章 编写安全程序 第二十三章 字符串匹配 glob() fnmatch() regcomp()、regexec()、regfree()、regerror() 第二十四章 用S-Lang来处理终端 http://www.s-lang.org/download.html 第二十五章 基于散列的数据库函数库 http://qdbm.sourceforge.net/ 第二十六章 解析命令行选项 1. getopt() getopt_long() man getopt 2. popt library man popt 第二十七章 运行时动态加载 dlopen() dlsym() dlerror() dlclose() 第二十八章 用户识别和认证 1. getpwuid() getpwnam() getgrgid() gergrnam() 2.PAM http://www.kernel.org/pub/linux/libs/pam/ ==================================== vim:filetype=changelog |