重定向和静态库/动态库操作

重定向和静态库/动态库操作

重定向:

本质: 
    让我们的newfd文件描述符拷贝oldfd文件描述符,然后再关闭newfd, 标准输出拷贝tmpfile 指向新的struct file
标准输入, 标准输出, 标准错误各自所代表的struct file*都指向各自的struct file
现在我们打开一个文件tmpfile, 会自动创建一个struct file* 同样打开一个文件 struct file
将标准输入的内容重定向到我们的tmpfile当中, 让标准输出不要指向原来的struct file, 现在指向tmpfile的struct file, echo后就将内容写到了tmpfile

int dup2(int oldfd, int newfd) 重定向的
   oldfd和newfd都是文件描述符
   oldfd: 需要被拷贝的文件描述符 
   newfd: 需要被更改的文件描述符
将标准输出的内容重定向到tmpfile当中
   fd = 1           fd = 3
1. newfd(标准输出)拷贝oldfd(tmpfile的文件描述符)
2. 关闭(newfd)标准输出
3. 当拷贝成功, 关闭newfd
4. 没有拷贝成功
    4.1 如果拷贝的oldfd是一个无效的文件描述符, 则dup2什么都没有干,      切记: 没有关闭newfd
    4.2 如果拷贝的oldfd是一个有效的文件描述符 但是要拷贝的newfd和oldfd具有相同的值, 则dup2同样什么都不干 也没有关闭newfd

// 将标准输出重定向到我们的tmpfile中去, 其实就是改变当前所保存的struct file地址, 拷贝的是文件描述符 -> 从而改变指向, 
// 让newfd拷贝oldfd , 改变的是newfd
// int dup2(int oldfd, int newfd);
// 前面是old(tmpfile), 后面是new(标准输出) 
// 需要被修改的是标准输出, 模板是tmpfile 

echo "hehe" > tmpfile 是清空 重写 (相当于带了O_TRUNK)
echo "hehe" >> tmpfile 是追加, 另起一行写  (相当于带了O_APPEND)

静态库和动态库

静态库: 
   1. Windows环境下的后缀是.lib, 在Windows环境下编译一个依赖库文件的库执行程序, 在编译阶段依赖静态库(.lib), 在程序运行阶段, 依赖动态库(.dll)
   2. 静态库会将编译的代码当中所有的函数全部编译到静态库当中去; gcc -static静态链接指的是gcc或者g++的命令行参数; 静态库是一个库文件
   3. -static: 如果程序是静态链接生成的可执行程序, 会将静态库当中的所有代码全部编译到可执行程序中去, 当程序执行的时候, 就不需要再依赖静态库了,
   4. linux环境下, 后缀为.a, 前缀是lib(libxxx.a就是一个静态库), xxx就是库文件名称
   5. 静态库的生成与使用
        静态库的生成: 需要注意的是, 在生成静态库时, 是使用.o文件来进行编译生成的 , 而不是源码文件生成的
            ar -rc lib[待生成的静态库文件名称].a[xxx].o[xxx].o
   6. 静态库的使用
        -L[path] 指定静态库的搜素路径,;
        -l[静态库文件名称(去了前缀和后缀的名称)]:指定链接的静态库
        eg: gcc main.c -o main -L [path] -l[库文件名称]
动态库
    1. Windows环境下动态库的后缀是.dll
    2. linux环境下动态库的后缀是.so, 前缀是lib
    3. 动态库的生成和使用
        动态库的生成:
        	gcc/g++
            -shared: 生成共享库的命令行参数
            -fPIC: 产生位置无关的代码
            gcc/g++ -shared -fPIC[源码文件] -o lib[待生成的动态库的名称].so
        动态库的使用:
        	-L [path] 直到链接的库文件路径;
        	-l[库文件名称(去了前缀和后缀的名称)]: 指定链接库文件名称
        	LD_LIBRARY_PATH : 搜索动态库的环境变量

如何让程序可以找到依赖的动态库 ?
1. 将动态库放到当前可执行程序的目录下
2. 在环境变量当中设置动态库的搜索路径, 设置环境变量 LD_LIBRARY_PATH
3. 不推荐: 直接将自己写的库或者第三方库文件和操作系统库文件放到一起 /usr/lib64
ldd + 可执行程序名称 (可打印程序或者库文件所依赖的共享库列表)

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页