零 补充
vim 补全:
ctrl + n
vim 窗口切换
alt + 数字
ld 是链接器
查找文件中的某一个函数:
在视图模式下:
输入 /xxxx
快捷键:
高亮某一个函数或者变量:
shift + #
n / N 查找上一个/下一个
一 回忆昨天的内容
计算语言的发展史
静态库的制作和使用
ar -r .a *.o
每使用一次,在内存中拷贝一份。
静态链接在链接的时候,会链接到实际的代码。
环境变量
name=value
env
env | grep "xxxx"
PS1 命令行的提示符 PS1='\W\$'
PATH 环境变量
告诉编译器去哪里找命令,库文件,运行时文件
动态库的制作和使用
gcc -shared -o lib + 库名.so *.o
在运行时链接动态库,链接的时候不发生实际链接
gcc -fPIC
与位置无关
gcc a.out -LImath.so -v
ldd a.out
/bin
在内存中只有一个备份
_start
main
__init_xxx
__fnin__xxx
二 动态加载
按需加载
malloc 动态申请内存 堆区
Linux提供了一系列的动态加载的库函数
dlopen (3)
void *dlopen (const char *filename, int flag);
功能
打开一个共享库
参数
filename 指定了要打开的共享库的文件名
flag
RTLD_LAZY 懒加载 只有函数被执行的时候,才去加载。
RTLD_NOW 立即加载 在函数返回之前,
所有符号的位置都被确定下来了。
返回值
NULL 调用函数失败
非NULL 成功
dlclose
功能:
关闭共享库,引用计数减一。
参数:
handle: dlopen 的返回值,
指定了要关闭的共享库的地址。
返回值:
成功 0
错误 非0
gcc dynamic.c -ldl
a.out
a.out libImath.so //命令行传参
ldd a.out
dlerror (3)
功能:
获取dlopen API错误信息
参数:
void
返回值:
成功 返回错误信息的字符串
错误 代表没有错误发生,因为本身就是在检查错误
dlsym (3)
功能:
获取一个共享库中符号加载到内存中的地址。
参数:
handle: 指定了共享库,在共享库中查找symol
symbol: 指定了要查找的函数
返回值:
成功 返回要查找的函数加载到内存中的地址
失败 返回NULL 失败原因也可以由dlerror诊断(获取)
代码参见 dynamic.c
gcc dynamic.c -ldl
./a.out libImath.so
nm a.out ---> 已经看不到p_add的影子了
三 系统中的错误处理
在系统中有一个全局变量 errno
errno (3)
当库函数和系统调用产生错误的时候,
由errno记录错误信息。
可以通过错误编号,了解错误信息
举例说明:文件的操作
参见file.c
gcc file.c
a.out hello //报错
a.out file.c
touch hello
a.out hello
chmod a-r hello
a.out hello //报错
两次报错的原因不一样
errno 是错误的编号,找到错误的编号,就找到错误的信息。
如何找到错误的信息:
perror (3)
strerror (3)
strerror
功能
描述错误码的具体信息
参数
errno
返回值
具体信息的字符串
perror
功能:
打印一条系统的错误信息
参数:
自己指定的字符串
返回值:
void
四 文件夹的操作
mkdir Wilhelm
chmod a-r Wilhelm
ls -al Wilhelim //权限不够
x ---> "可通过"
删除x权限,不能进入文件夹
打开文件夹
opendir (3)
功能:打开一个文件夹
参数:要打开的文件夹的名字
返回值:
成功 返回指向文件夹流的名字
错误 NULL
readdir (3)
功能:在文件夹中搜索一个条目
参数:dirp 指向文件夹流
返回值:
成功 返回一个地址,指向文件夹流的下一条地址
错误 NULL 到文件夹流的末尾 或者 一个错误
closedir (3)
功能:关闭一个文件夹流
参数:dirp 指向文件夹流
返回值:成功返回 0
错误返回 -1
举例说明:
遍历文件夹