1、UC:unix下C开发
1)系统调用 函数的使用方法
2)操作系统原理、进程间的通信方式、线程间的同步机制、线程和进程的区别、任务调度策略
2、Linux系统
Ubuntu、RedHat、Fedora…
3、书籍推荐
《Unix环境高级编程》、《Linux程序设计》、《鸟哥私房菜》、《Linux网络编程》
一、基本介绍
1、具体内容:
开发环境、内存管理、文件操作、进程管理 进程间通信、信号处理、网络编程、线程管理
内核->系统调用->shell(壳)->应用程序
2、开发环境
2.1 unix / linux发展历程
1970 贝尔实验室 unix
GNU linux
2.2 重新审视编译工具gcc
-
1)预处理
-
处理.c文件中以#开头的内容
例:gcc hello.c -E -o hello.i
2)编译
-
由c变成汇编
例:gcc hello.i -S
3)汇编
-
由汇编文件翻译成目标代码
例:gcc -c hello.s -o hello.o
4)链接
-
把多个.o链接生成一个可执行文件
例:gcc hello.o -o hello
2.3 关于gcc重要参数:
-c:只编译不链接
-o:指定目标文件名称
-E:预编译
-S:产生汇编文件
-g:产生gdb调试信息
-Wall:产生尽可能多的警告信息
-Werror:要求编译器将警告当作错误进行处理
-I:(i大写)
-L:指定库的搜索路径
-l:使用的库文件的名称(L小写)
-v:显示编译器的版本号 / 显示编译的全部过程
2.4 重新审视.c .h文件
-
头文件作用是什么?什么内容放入头文件?
-
1)声明外部变量或者函数
定义:int a;
声明:extern int a;
2)宏定义 类型别名(tyoedef) 自定义数据类型
3)包含其他头文件
#include <> //在系统指定目录下查找指定文件
#include "" //先在当前目录下找,再查找系统目录
-
系统目录:
- /usr/include .h和.c没有在同一个目录下:
-
1)将.h文件放入系统头文件目录;
2)include “/path/xxx.h”
相对路径(推荐)
绝对路径
3)gcc … -Ipath
2.5 预编译指示符
#define 定义宏
#if 判定
#elif else if多选分支
#else
#endif 结束判定
#ifdef 判定宏是否定义
#ifndef 判定宏是否定义
#error 产生错误,挂起预处理程序
#warning 创建一个警告
#undef 删除宏
#line 指定行号
例:#pragma GCC poison goto
.#pragma pack(1) 按1字节对齐
对齐:每个成员必须放在自己大小整数倍的位置上,如果自身大于4字节按4字节对齐。
补齐:每个结构体应该是最大成员的整数倍,最大成员超过4字节按4字节计算。
2.6 预定义宏
__FILE__
:指定源码所在文件 %s
__LINE__
:行数 %d // LINE所在的行号
__FUNCTION__
:当前函数名 %s
__func__
__TIME__
:时间 %s // 编译时的时间
__DATE__
:日期 %s
__cplusplus
:c++有效
2.7 重新审视a.out
问题1:./a.out
ls不用+路径
答案:环境变量 PATH:echo $PATH
问题2:printf()
函数的定义在哪?
void printf(…)
{
}
答案:ldd ./a.out(在libc.so.6库中)