UC高级编程复习
一.搭建开发环境
1.采用gitee仓库来进行环境的搭配,注册账户https://gitee.com/
2.git的基本使用
将代码推送上去
git pull
2.向仓库提交代码状态
git add.
git commit -m "文件名字/代码"
git push
二.linux系统初步了解
3.linux下的管理方式有五种
进程管理
内存管理
文件系统管理
网络设备管理
设备文件管理
4.程序是静态的,是计算机指令的集合,存放在硬盘里面
进程是动态的,运行在内存里面,是程序的实例
5.在linux文件管理下查询函数的方法调用 怎么查找呢
man 3 printf //man 3 属于库函数调用
man 2 open //man 2 属于系统调用
man 1 //属于命令调用
6.在查询函数的功能时要注意什么东西呢
1.函数的功能
2.函数的参数
3.函数的返回值三大要素
-
在C语言中函数的处理过程
1.预处理
在预处理过程中,-E指令是给预处理器下的命令,就是文件内容的替换和注释的去除,并不参与实际的参数编译
gcc -E hello.c -o hello.i
-
编译、
在编译中,是将C语言的内容,编译为汇编指令
gcc -S hello.i -o hello.s
-
3.汇编指令
汇编的过程就是将汇编文件翻译为机器码的过程
gcc -c hello.s -o hello.o
4.链接
链接就是将目标文件和库文件或者运行中的文件整理到一起生成可执行文件
gcc a.out
ldd a.out
三.C语言编程思想
1.头文件中声明接口
2.在源文件中实现接口
3.另写一个程序,然后调用接口
例子
头文件声明 ,并且防止头文件重复
#ifndef __MYMATH_H__
#define __MYMATH_H__
#endif
编译只能检查出来有没有语法错误,其他问题是不是发现不了
命令nm:
nm test.o
U e_add
U e_div
U e_mul
U e_sub
nm查看文件中的符号表
T:有该函数的定义
U:标识函数的调用
链接分为静态链接和动态链接
静态链接:
静态链接是在生成可执行文件的情况下,链接已经完成了
动态链接:
动态链接是生成可执行文件的情况下,链接已经发生,但是并没有链接到实际的代码,这种叫做动态链接
静态库与动态库的制作
1.静态库的命名
lib +库名.a
2.要将静态库文件编译为目标文件
gcc -c *.c
3.将目标文件添加到静态库中
ar -r libmymath.a *.o
4.使用静态库生成可执行程序
gcc test.o -L路径名 -l 库名
gcc main.c -L. -lmylibrary -o main
5.环境变量的初识
环境变量是跟进程相关的, 每个进程都有自己的环境变量
进程可以通过环境变量去查找或者访问相关的资源
env bash进程的环境变量
环境变量的组织格式:
name=value
如何获取环境变量的值:
$name
如何更改环境变量的值:
name=newvalue
echo $name //可以查看name环境变量的值
\W 是当前路径的最有一个文件夹的名字
bash的脚本
vi ~/.bashrc
修改完
source ~/.bashrc
动态库的制作
1.动态库的命名
lib +库名.so
2.将要加入动态库的文件编译位于无关的目标文件
gcc -fPIC -c *.c-fPIC 生成的目标文件与位置无关
3.将生成的目标文件打包到动态库
gcc -shared -o libmymath.so *.o
4.使用动态库生成可执行文件
gcc -c test.c
gcc test.o -L 02mymath -l mymath / gcc test.o -lmymath
如何指导a.out 依赖动态库
5.LD_LIBRARY_PATH 用来制定动态库的链接路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH
静态库与动态库的区别
1.首先在命令编译时 用fPIC是动态库,没有的是静态库
2.其次在编译和链接状态到可执行文件时,静态库已经确定了文件的大小,动态库是在程序运行才确定到文件的大小.
3.静态库, 每使用一次都要往内存中加载一份代码, 而动态库在内存中只有一份副本
4.使用静态链接生成的可执行程序的尺寸要大于动态链接生成的可执行程序
动态加载:又称为按需加载,与malloc的原理相似,系统提供一系列动态加载库
dlopen(const char *filename,int flags)//打开一个动态库,成功打开非空,失败为NULL
flags:懒加载 RTLD_LAZY
立即加载:RTLD_NOW
int dlclose(void *handle)//关闭一个动态库 handle :dlopen的返回值
linux基本命令
1.查看文件的大小
du -sh/-ch filename
2.标准输入缓冲区对应的文件是 /dev/stdin
标准输出缓冲区对应的文件是/dev/stdout
标准错误输出缓冲区对应的文件是 /dev/stderr
四:标准IO
C标准约定的输入输出接口库函数, 所以函数的头文件都是stdio.h
内容存储在磁盘
标准IO操作
-
打开文件
fopen(3)
FILE *fopen(const char *pathname, const char *mode);
功能:打开一个文件流
参数:pathname 路径
mode 文件打开的模式
“r” 只读, 文件流指向文件的开头
“r+” 读写, 文件流指向文件的开头
“w” 只写, 如果文件存在将文件截断为0, 文件不存在 则创建, 文件流指向文件的开头
“w+” 读写, 如果文件存在将文件截断为0, 文件不存 在则创建, 文件流指向文件的开头
“a” 追加, 文件不存在则创建, 存在往文件末尾写, 文 件流指向文件的末尾
“a+” 读+追加, 文件不存在则创建, 如果读文件, 文件 流指向文件的开头
写文件, 文件流指向文件的末尾
返回值:文件流
如果有创建文件 文件的权限是0666,可以被进程umask(2)或更改
文件默认权限umask mode&~(umask)
-
rw-rw-r–
第一组 -:表示文件的类型
-:表示普通文件第二组rw-rw-r–: 表示不同用户对该文件的权限
rw-: 表示文件的拥有者对文件的权限 owner
rw-: 表示文件的所属组对文件的权限 group
r–: 表示文件的其他用户对文件的权限 other
r: 读权限
w:写权限
x: 执行权限umask: 设置创建文件权限的掩码
如果掩码对应的位为1, 则文件权限对应的位的权限会被拿走
a.按字符读:fgetc(3) getchar(3) getc(3)
int fgetc(FILE *stream);
功能:从一个文件流读取一个字符
参数:stream 文件流
返回值: 成功 字符 读到文件末尾 EOF
错误 EOF
b.按行读: gets(3) fgets(3) getline(3)
char *fgets(char *s, int size, FILE *stream);
功能:
从stream中读取最多size-1个字节s指向的buffer中,
如果遇到EOF或者'\n'则停止, 在buf的最后保存‘\0’
参数: s, 保存读到的字符
size, 指定读取的字符个数
stream, 文件流
返回值:
成功:s NULL(读到EOF)
错误:NULL
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
功能:
从stream文件流中读取一行字符, 放到*lineptr, 存储空间大小*n,
返回读取到的字节个数
参数:
*lineptr:保存读到的一行数据的地址
*n, 保存的是读取的字节个数
stream, 文件流
返回值:
成功 读取到的字节个数
错误 -1 errno被设置
如果*lineptr为NULL且*n为0, 内核会自动开辟*n一段空间大小
当不足以容纳一行的时候, getline会重新开辟
c.按结构读:fread(3)
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
从文件流中读取nmemb个元素, 每个元素size个字节,到ptr指向的内存中
参数:
ptr: 保存读到数据的地址
size: 元素大小
nmemb: 元素个数
stream: 文件流
返回值:
成功 size
错误 <size / 0 ferror(3)/feof(3)
d.格式化读:scanf(3) fscanf(3)
a.按字符写:fputc(3) putchar(3) putc(3)
int fputc(int c, FILE *stream);
功能:写一个字符到文件流中
参数:c, 要向文件流中写入的字符
stream, 文件流
int --> unsigned char
返回值:成功 int类型的字符
错误 EOF
b.按行写:puts(3) fputs(3)
int fputs(const char *s, FILE *stream);
功能:
将s指向的buffer中的string写到文件流中
参数:
s stream
返回值:
成功:非负整数
错误:EOF
c.按结构写:fwrite(3)
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
功能:从ptr指向的内存中写nmemb个字节的数据,数据的大小是size, 到stream中
参数:巴拉巴拉
返回值:成功 int类型的字符, 返回的时读取成功的字节个数!
错误 EOF
d.格式化写:printf(3) sprintf(3) snprintf(3)
定位文件
fseek(3) rewind(3) ftell(3)
关闭文件
fclose(3)
功能:关闭文件流, 刷新缓冲区
参数:文件流
返回值:成功 0
错误 EOF
获取io的错误信息
int ferror(FILE *stream);
e(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
功能:从ptr指向的内存中写nmemb个字节的数据,数据的大小是size, 到stream中
参数:巴拉巴拉
返回值:成功 int类型的字符, 返回的时读取成功的字节个数!
错误 EOF
d.格式化写:printf(3) sprintf(3) snprintf(3)
定位文件
fseek(3) rewind(3) ftell(3)
关闭文件
fclose(3)
功能:关闭文件流, 刷新缓冲区
参数:文件流
返回值:成功 0
错误 EOF
获取io的错误信息
int ferror(FILE *stream);
文件末尾的标记:EOF