UNIX C编程:
一、课程内容:开发环境,内存管理,文件系统,进程管理,信号(进程间的语言)处理,网络通信,线程管理,线程同步。
二、Unix操作系统知识介绍。
1、美国AT&T公司(美国电报电话公司),贝尔实验室,1971年,肯.汤普逊、[丹尼斯.里奇],PDP-11,多任务,多用户,多处理器架构,高安全性,高可靠性,高稳定性,关键商务系统,商业应用,移动终端,嵌入式设备。
2、三大版本派系:A、基于System V。1)IBM的AIX系统,主要用于银行
2)Oracle(以前SUN公司的)Solaris,主要用于电信
3)惠普的HP-UX,主要用于教育科研
4)IRIX,主要用于图形工作站
B、基于Berkley。 1)FreeBSD
2)NetBSD
3)OpenBSD
4)Mac OS X
C、基于Linux。 1)Minix:迷你版UNIX系统
2)Linux:GPL,免费开源,商用服务器(RedHat),桌面系统(Ubuntu),嵌入式系统(Android)
三、Linux操作系统————类Unix系统。
1、类UNIX操作系统,免费开源。
2、不同发源版本使用相同内核。
3、严格意义上讲,Linux仅指操作系统内核,隶属于GNU(GNU Not Unix)工程。
4、发明人:Linus Torvalds。
5、标志:小企鹅,名为Tuxedo(燕尾服)。
四、POSIX(Portable Operating System Interface for Computing Systems)标准————统一系统编程接口规范
1、IEEE(电气电子工程师协会)和ISO(国际标准化组织)合作制定。
2、基于POSIX接口的开发是可移植的。
五、GPL——————通用公共许可证:允许对其成果及其派生成果进行重用,修改和复制,对所有人都是自由的,但是不能声明做了原始工作。
六、版本。
1、早期版本:0.01,0.02,...,1.0。
2、旧计划:介于1.0和2.6之间,A.B.C。
A表示主版本号,内核大幅更新;
B次版本号,内核重大修改,奇数为测试版本,偶数为稳定版本。;
C补丁序号,内核轻微修订。
3、2003年12月发布2.6.0以后,发布周期缩短,A.B.C-D,E。
D表示构建次数反映及其微小的更新;
E描述信息,rc/r-候选版本,后面跟一个数字表示第几个候选版本,数字越大越接近正式版;smp-对称多处理器;pp-专门针对RedHat测试版;EL-RedHat正式企业版;mm-针对最新技术的体验版本;fc-Fedora Core版本。
七、主流的Linux发行版本。
1、Ubuntu--大众化,稳定
2、Linux Mint--时尚
3、Fedora--桌面版的RedHat,应用丰富
4、openSUSE --外观华丽,欧洲国家很受欢迎
5、Debian--开放,自由,免费
6、Slackware--简洁,朴素,倾向专业人事
7、RedHat--经典,支持丰富
开发环境
一、GNU编译环境工具----GCC
1、支持多种编程语言。C、C++、Object-C、Java、Fortran(用于数学计算)、Pascal、Ada。
2、支持多种平台:Unix,Linux,Windows。
3、构建过程----GCC工具链
1、编辑:vi hello.c -> hello.c
2、预编译:头文件扩展,宏扩展。 gcc -E hello.c -o hello.i -> hello.i
3、编译:gcc -S hello.i -> hello.s
4、汇编:gcc -c hello.s -> hello.o
5、链接:gcc hello.o (-lc) -> a.out
4、文件后缀。
.h -C语言源代码头文件
.c -C预处理前的C语言源代码文件
.i -C预处理后的C语言源代码文件
.s -汇编语言文件
.o -目标文件
.a -静态库文件
.so -共享库(动态库)文件
5、编译单个源文件
gcc [参数] 文件
参数:
1、-c 编译+汇编
2、-o 指定输出文件路径
3、-E 预编译
4、-S 编译产生汇编文件
5、-pedantic 对程序中不符合标准C的代码给出警告
6、-Wall 产生尽可能多的警告
7、-Werror 将警告作为错误
8、-x 指定源代码文件的语言(默认是按文件扩展名来区分)
9、-g 生成可调试的可执行文件。
gdb 可调试的可执行文件 进入调试环境,比如对gcc -g hello.c产生a.out;使用gdb a.out进入调试环境
l 显示程序完整代码
b 行号 对指定行号设置断点
r 运行程序(到断点)
s 进入函数里面
p 变量名 打印当前行号中变量的值
n 执行下一行
q 退出gdb调试环境
10、-O1/O2/O3 优化等级,缺省O1,O0表示不优化;某些系统上的gcc支持Os,相当于O2.5。
11、-D 在编译时定义宏
12、-I 在使用gcc编译时指定头文件的附加搜索路径
6、编译多个源文件
gcc [参数] a.c b.c c.c d.c
makefile/make(如果脚本不叫makefile,则可以使用gcc -f xxx.mak)
1、声明外部变量和函数。(定义是声明变量并进行赋值,它伴随着内存的分配;声明没有内存的分配,只是标志以后可以使用)
在头文件中书写
extern int g_x;
int add(int, int);
2、定义宏、类型别名、自定义类型
#define PI 3.141592654
typedef unsigned int UNIT;
typedef struct student{
char name[128];
int age;
}stu;
3、公共头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
4、头文件卫士,防止因钻石包(重复包含)含导致的重定义。
#ifndef __HEAD_H__
#define __HEAD_H__
//函数声明,外部变量声明以及结构体声明等
#endif //__HEAD_H__
5、gcc的-I选项,在编译时指定头文件的附加目录
#include <...> 包含系统指定目录的头文件
通常的系统的目录:/usr/include
/usr/local/include
/usr/lib/gcc/i686-linux-gnu/4.6/include
/usr/include/c++/4.6 (c++编译器使用)
6、预处理指令
#include 包含头文件
#define 宏定义
#undef 取消宏定义
#if 判定宏定义
#elif/#else 判定宏定义
#endif 结束判定宏定义
## 连接字符串
# 将宏转换成字符串子面值
#error 人为的设置错误,结束并终止预编译过程
#warning 人为的设置警告,并不结束并终止预编译过程
#line 人为的指定行号
#pragma 为处理器提供额外信息
#pragma GCC dependency 指定文件 如果指定文件比当前文件新,产生警告
#pragma GCC poison 标识符(组) 如果程序中出现标识符,直接报错,起到禁用某种标识作用
#pragma pack(n) 对结构体子变量按n(1/2/4/8)字节对齐和补齐(32位操作系统超过4个字节按4个字节对齐补齐)。
#pragma pack() 对结构体子变量按缺省方式(系统默认)对齐和补齐。
7、预定义宏
__BASE_FILE__ 正在被编译的源文件名
__FILE__ 所在的文件名
__LINE__ 所在的行号
__FUNCTION 所在函数名
__func__ 同__FUNCTION__
__DATA__ 编译日期
__TIME__ 编译时间
__INCLUDE_LEVEL__ 包含层数,从0开始
__cplusplus 是否为c++编译器,是c++编译器此宏为1,否则此宏无定义。
8、环境变量
C_INCLUDE_PATH 头文件搜索路径和CPATH等价(和-I选项作用一样,只是为了不用每次都使用-I选项配置的头文件路径)
CPATH 头文件搜索路径
CPLUS_INCLUDE_PATH C++头文件的附加搜索路径
LIBRARY_PATH 链接时库文件搜索路径(和-L选项作用一样,只是为了不用每次都使用-L选项配置的库文件路径)
LD_LIBRARY_PATH 运行时库文件搜索路径
一、课程内容:开发环境,内存管理,文件系统,进程管理,信号(进程间的语言)处理,网络通信,线程管理,线程同步。
二、Unix操作系统知识介绍。
1、美国AT&T公司(美国电报电话公司),贝尔实验室,1971年,肯.汤普逊、[丹尼斯.里奇],PDP-11,多任务,多用户,多处理器架构,高安全性,高可靠性,高稳定性,关键商务系统,商业应用,移动终端,嵌入式设备。
2、三大版本派系:A、基于System V。1)IBM的AIX系统,主要用于银行
2)Oracle(以前SUN公司的)Solaris,主要用于电信
3)惠普的HP-UX,主要用于教育科研
4)IRIX,主要用于图形工作站
B、基于Berkley。 1)FreeBSD
2)NetBSD
3)OpenBSD
4)Mac OS X
C、基于Linux。 1)Minix:迷你版UNIX系统
2)Linux:GPL,免费开源,商用服务器(RedHat),桌面系统(Ubuntu),嵌入式系统(Android)
三、Linux操作系统————类Unix系统。
1、类UNIX操作系统,免费开源。
2、不同发源版本使用相同内核。
3、严格意义上讲,Linux仅指操作系统内核,隶属于GNU(GNU Not Unix)工程。
4、发明人:Linus Torvalds。
5、标志:小企鹅,名为Tuxedo(燕尾服)。
四、POSIX(Portable Operating System Interface for Computing Systems)标准————统一系统编程接口规范
1、IEEE(电气电子工程师协会)和ISO(国际标准化组织)合作制定。
2、基于POSIX接口的开发是可移植的。
五、GPL——————通用公共许可证:允许对其成果及其派生成果进行重用,修改和复制,对所有人都是自由的,但是不能声明做了原始工作。
六、版本。
1、早期版本:0.01,0.02,...,1.0。
2、旧计划:介于1.0和2.6之间,A.B.C。
A表示主版本号,内核大幅更新;
B次版本号,内核重大修改,奇数为测试版本,偶数为稳定版本。;
C补丁序号,内核轻微修订。
3、2003年12月发布2.6.0以后,发布周期缩短,A.B.C-D,E。
D表示构建次数反映及其微小的更新;
E描述信息,rc/r-候选版本,后面跟一个数字表示第几个候选版本,数字越大越接近正式版;smp-对称多处理器;pp-专门针对RedHat测试版;EL-RedHat正式企业版;mm-针对最新技术的体验版本;fc-Fedora Core版本。
七、主流的Linux发行版本。
1、Ubuntu--大众化,稳定
2、Linux Mint--时尚
3、Fedora--桌面版的RedHat,应用丰富
4、openSUSE --外观华丽,欧洲国家很受欢迎
5、Debian--开放,自由,免费
6、Slackware--简洁,朴素,倾向专业人事
7、RedHat--经典,支持丰富
开发环境
一、GNU编译环境工具----GCC
1、支持多种编程语言。C、C++、Object-C、Java、Fortran(用于数学计算)、Pascal、Ada。
2、支持多种平台:Unix,Linux,Windows。
3、构建过程----GCC工具链
1、编辑:vi hello.c -> hello.c
2、预编译:头文件扩展,宏扩展。 gcc -E hello.c -o hello.i -> hello.i
3、编译:gcc -S hello.i -> hello.s
4、汇编:gcc -c hello.s -> hello.o
5、链接:gcc hello.o (-lc) -> a.out
4、文件后缀。
.h -C语言源代码头文件
.c -C预处理前的C语言源代码文件
.i -C预处理后的C语言源代码文件
.s -汇编语言文件
.o -目标文件
.a -静态库文件
.so -共享库(动态库)文件
5、编译单个源文件
gcc [参数] 文件
参数:
1、-c 编译+汇编
2、-o 指定输出文件路径
3、-E 预编译
4、-S 编译产生汇编文件
5、-pedantic 对程序中不符合标准C的代码给出警告
6、-Wall 产生尽可能多的警告
7、-Werror 将警告作为错误
8、-x 指定源代码文件的语言(默认是按文件扩展名来区分)
9、-g 生成可调试的可执行文件。
gdb 可调试的可执行文件 进入调试环境,比如对gcc -g hello.c产生a.out;使用gdb a.out进入调试环境
l 显示程序完整代码
b 行号 对指定行号设置断点
r 运行程序(到断点)
s 进入函数里面
p 变量名 打印当前行号中变量的值
n 执行下一行
q 退出gdb调试环境
10、-O1/O2/O3 优化等级,缺省O1,O0表示不优化;某些系统上的gcc支持Os,相当于O2.5。
11、-D 在编译时定义宏
12、-I 在使用gcc编译时指定头文件的附加搜索路径
6、编译多个源文件
gcc [参数] a.c b.c c.c d.c
makefile/make(如果脚本不叫makefile,则可以使用gcc -f xxx.mak)
1、声明外部变量和函数。(定义是声明变量并进行赋值,它伴随着内存的分配;声明没有内存的分配,只是标志以后可以使用)
在头文件中书写
extern int g_x;
int add(int, int);
2、定义宏、类型别名、自定义类型
#define PI 3.141592654
typedef unsigned int UNIT;
typedef struct student{
char name[128];
int age;
}stu;
3、公共头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
4、头文件卫士,防止因钻石包(重复包含)含导致的重定义。
#ifndef __HEAD_H__
#define __HEAD_H__
//函数声明,外部变量声明以及结构体声明等
#endif //__HEAD_H__
5、gcc的-I选项,在编译时指定头文件的附加目录
#include <...> 包含系统指定目录的头文件
通常的系统的目录:/usr/include
/usr/local/include
/usr/lib/gcc/i686-linux-gnu/4.6/include
/usr/include/c++/4.6 (c++编译器使用)
6、预处理指令
#include 包含头文件
#define 宏定义
#undef 取消宏定义
#if 判定宏定义
#elif/#else 判定宏定义
#endif 结束判定宏定义
## 连接字符串
# 将宏转换成字符串子面值
#error 人为的设置错误,结束并终止预编译过程
#warning 人为的设置警告,并不结束并终止预编译过程
#line 人为的指定行号
#pragma 为处理器提供额外信息
#pragma GCC dependency 指定文件 如果指定文件比当前文件新,产生警告
#pragma GCC poison 标识符(组) 如果程序中出现标识符,直接报错,起到禁用某种标识作用
#pragma pack(n) 对结构体子变量按n(1/2/4/8)字节对齐和补齐(32位操作系统超过4个字节按4个字节对齐补齐)。
#pragma pack() 对结构体子变量按缺省方式(系统默认)对齐和补齐。
7、预定义宏
__BASE_FILE__ 正在被编译的源文件名
__FILE__ 所在的文件名
__LINE__ 所在的行号
__FUNCTION 所在函数名
__func__ 同__FUNCTION__
__DATA__ 编译日期
__TIME__ 编译时间
__INCLUDE_LEVEL__ 包含层数,从0开始
__cplusplus 是否为c++编译器,是c++编译器此宏为1,否则此宏无定义。
8、环境变量
C_INCLUDE_PATH 头文件搜索路径和CPATH等价(和-I选项作用一样,只是为了不用每次都使用-I选项配置的头文件路径)
CPATH 头文件搜索路径
CPLUS_INCLUDE_PATH C++头文件的附加搜索路径
LIBRARY_PATH 链接时库文件搜索路径(和-L选项作用一样,只是为了不用每次都使用-L选项配置的库文件路径)
LD_LIBRARY_PATH 运行时库文件搜索路径