文章目录
Linux程序设计
一、入门
-
UNIX哲学 KISS keep it small and simple
-
ASCII码文本文件或XML文件作为配置文件和数据文件
-
Linux应用程序表现为两种类型文件:可执行文件和脚本文件
-
Linux中文件扩展名除了人眼区别文件,没啥用
-
文件位置:
-
应用程序 /usr/bin
-
头文件/usr/include
-
库文件 /lib /usr/lib
-
静态库 p10
归档文件.a archive
ar crv libxxx.a *.o
ranlib libxxx.a # 为库生成内容表(GNU不必要)
nm libxxx.a #查看库中函数
-
动态库 p11
库可能是一个符号链接,尾数为主版本号 libm.soN
负责装在动态库的程序是ld.so (/etc/ld.so.conf是装载配置文件)
ldd program #可以查看使用到的库
-
-
二、shell程序设计
-
shell执行shell程序,这些程序通常称为脚本
-
一点哲学:代码的高度可重用性,即一个程序只完成一个功能,但是完成的很完美
-
管道和重定向
-
通用的回收站==/dev/null==
-
shell程序设计里,0表示成功,why?
-
设置环境变量,export PATH=$PATH:xxx或者编辑bash_profile文件
-
./指定当前路径,和windows的cmd中不一样,必须写./ 这样可以避免意外执行到了同名脚本文件的命令
-
shell语法
-
变量、环境变量、参数变量、条件、控制结构
-
点(.)命令
-
执行文件时候的./xxx的点命令,等同于source命令
-
==*==通常一个脚本执行的时候,它会创建一个新的环境(一个子shell),命令将在这个新环境里面执行,执行完毕便丢弃该环境,留下退出码返回给父shell、
-
退出码为0表示成功。用0表示,这一做法的一个大优点是:它使得你可以使用多达125个用户自定义的错误代码,而不需要一个全局的错误代码变量(这一句话不是很理解)p46
-
-
shift命令 左移参数变量
-
trap命令 用于指定接收到信号后将要采取的行为
-
unset命令 从环境变量中删除变量或者函数
-
find命令 搜索文件的命令
#根目录开始寻找文件名为test的路径并且打印出来 find / -name test -printf #不搜索挂载的目录 find / -mount -name test -printf
-
grep命令 general Regular Expression Parser 在文件中搜索字符串的命令
-
正则表达式
#查找以字母e结尾的行 grep e$ test.txt
-
here文档
-
-
迈向图形化:dialog工具
-
综合应用:管理CD唱片程序
三、文件操作
-
在linux,一切都是文件
-
目录也是文件,不过是一种特殊类型的文件
目录除了本身包含的内容以外,还会拥有一个名字和一些属性,即管理信息。保存在inode中。
-
重要的3个设备文件:/dev/console、 /dev/tty、/dev/null
-
操作系统的核心为内核,是一组设备驱动程序,是一组对系统硬件进行控制的底层接口。每个驱动函数都定义组他自己的ioctl命令
-
write\read\open\close系统调用
-
TIMEFORMAT time 重置POSIX时间输出格式
-
dup\dup2 复制文件描述符的方法
-
标准IOfread\fwrite\fclose\fopen\fflush\fseek\fgetc\fgets
-
格式化输出输入
-
文件和目录的维护 chmod\chown\unlink\link\syslink系统调用 mkdir\rmdir \chdir\getcwd
-
扫描目录opendir\readdir\telldir\seekdir\closedir 目录文件扫描程序
-
错误处理 strerror\perror
-
/proc文件系统
-
高级主题:fcntl和mmap
四、linux环境
-
int main(int argc, char * argv[])
argc,argv参数往往由用户终端输入,由另一个程序提供,这个程序一般是shell,要求操作系统启动该新程序,shell接受用户输入的命令行,将命令行分解成单词,然后将这些单词放入argv数组中
-
getopt c语言程序中提供命令行开关的标准编程接口
将传递给成程序的main函数的argc和argv作为残烛,同时接受一个选项指定字符擦混optstring,该字符串告诉getopt哪些选项可用,以及它们是否有关联度。optstring只是一个字符串列表,冒号’:'连接各字符串选项
-
getipt_long 区别在于针对 – 。 至于-和–选项的事情和unix的发展有关
-
环境变量 getenv\putenv
-
时间和日期 time\gmtime\mktime\localtime\ctime\asctime\strptime\strftime
-
用户信息 /etc/shadow文件 getpwuid\getpwnam
-
主机信息 uname\gethostname\gethostid
-
日志 /usr/adm、 /var/log syslog\openlog\closelog\setlogmask
-
资源和限制
五、终端
-
标准模式和非标准模式
终端允许用户回退删除字符,这样称之为规范模式,也叫标准模式
-
linux将LF表示一行的结束,这样做可以使得文本文件和二进制文件无任何实际的区别(这里怎么理解?answer),只有对IO设备才需要对回车符CR做处理
-
与终端进行对话 使用/dev/tty
-
终端驱动程序和通用终端接口GTI(联想到GUI、CLI)
-
termios结构 控制终端接口,控制键盘的输入
-
终端的输出 printf函数将字符输出到屏幕上,但还没有办法将输出的内容放置在屏幕的特定位置 p162
-
unix编写的程序很少去等待某个事件的发生,例如检测击键动作
-
虚拟控制台
-
伪终端PTY
六、使用curses函数库管理基于文本的屏幕
- curses标准作为一个重要的过渡,位于简单的文本行程序和完全图形化界面的X视窗系统程序之间
- 所谓屏幕就是你正在写的设备,终端屏幕或者是xterm屏幕?
- 键盘
- 窗口
- 彩色显示
- CD唱片应用程序 p200
七、数据管理 CSDN
- X/Open规范使UNIX风格操作系统以一种干净的方式来管理内存,不允许直接访问物理内存
- Linux为应用程序提供了一个简洁的视图,反映一个巨大的可直接寻址的内存空间
- DOS下的程序不能访问超过640k内存映射限制的内存范围
- malloc—>32位平台内存模型 p215
- test:请求全部的物理内存p216
- swap space交换空间
- 空指针、释放内存
- 动态内管理 简单的内存分配程序和请求全部的物理内存
- 文件锁定 原子操作创建锁文件
- 锁定文件区域
- 死锁p236
- dbm数据库
八、MySQL
-
检查MySQL服务器是否正在运行
ps -ef | grep mysqld
九、开发工具
- make命令和makefile文件
- 用make管理函数库
- 源代码控制 SCCS\RCS\CVS
- 编写手册页
- 发行软件 patch工具程序
- 其他软件发行工具
- RPM软件包管理程序
- Linux的IDE:KDevelop
十、调试
- 错误类型:功能定义错误、设计规划错误、代码编写错误
- 空运行 dry running
- 固化:让程序的错误可重现
- gdb
- 栈跟踪
- 用调试器打补丁
- 函数调用工具
- 用prof/gprof产生执行存档
- 断言assert
- valgrind 调试内存的工具
十一、进程和信号
- 进程表 早期UNIX系统只能同时运行256个进程,现在版本取决于进程表的内存容量。
- ps 查看进程
- 用户初始登陆是在第4个虚拟终端完成的,该终端是这台机器的一个主控台。
- init进程 操作系统的进程管理器
- getty进程
- 进程调度 状态R+表示这个程序是一个前台任务
- nice程序 表现良好的程序 nice值默认为0 nice命令和renice命令 终端显示NI 表示优先级
- fork exec wait
- 僵尸进程
- 信号 raise catch
- -HUP
- 线程不安全,可以设置一个标志位,进行检查
- 信号集
十二、POSIX线程
- 一个简单的线程程序p419
- 两个线程同时执行p422
- 同步
- 脱离状态
- 调度
- 取消一个线程
- 多线程
十三、进程间通信
- 管道
- 使用FIFO的客户/服务器应用程序 p468
十四、信号量、共享内存和消息队列
- Dekker算法 ”忙等待“或者”自旋锁“
- 信号量,一个只有两个值PV的变量,并且程序对其的访问都是原子操作
- 设置一个普通变量作为信号量不行吗? p489
- LInux信号量机制
- 共享内存
- 消息队列
- IPC状态命令 ipcs p511
十五、套接字
- 套接字既可以本地,也可以不同主机,主要是不同主机之间的进程通信。
- 本地套接字的名字是linux文件系统中的文件名,一般放在/tmp或者/usr/tmp
- 网络套接字 文件系统套接字
- localhost 127.0.0.1 /etc/hosts
- 主机字节序和网络字节序
- netstat命令查看网络连接状况 (记得删除已经连接的服务器进程)
- NIS 网络信息服务 Yellow Pages黄页服务
- getname
- 因特网守护进程xinetd/inetd
- 套接字选项’
- 多客户 select系统调用
- 数据报
十六、GTK+
- X视窗系统 一个开源图形化系统
- Linux两大桌面系统 :GNOME和KDE
- GUI编程关键元素:事件event 信号signal 窗口管理器
- 创建GUI的其他方法:平台无关的窗口API
- 拖放技术
- GTK+对象系统
- GNOME GNU Network Object Model Environment GNU网络对象模型环境
- Microsoft OLE?
- 事件、信号和回调函数(事件监听系统)
- 组装盒构件 GUI布局
- 控件
- 模式对话框和非模式对话框
十七、QT和KDE
- 信号和槽 p596 signals slots