一、
重定向概述:
1.清空重定向:
符号:>
#include<stdio.h>
#include<unistd.h>
int main()
{
struct _IO_FILE*fp=fopen("./1.txt","w+ ");
if(fp==NULL)
{
perror("open !! ");
return 0;
}
printf("open succsee! \n");
while(1)
{
sleep(1);
}
return 0;
}
~
使用echo进行重定向:
查看执行结果:
可见,使用清空重定向,会将源文件的信息先清除,再写入新的信息
2.追加重定向:
符号:>>
使用追加重定向,只将新的信息追加到源信息后
二、
从内核角度看重定向的原理:
实质上是让struct file* 指向另一个struct file结构
三、
重定向的函数接口:
int dup2(int oldfd,int newfd)
作用:将newfd的值重定向为oldfd,即将newfd拷贝到oldfd
参数:均为文件描述符
操作:
成功情况:关闭newfd;让newfd指向oldfd对应的struct file *的结构体
失败情况: 若oldfd是无效的文件描述符,失败、newfd无变化
若oldfd、newfd相同,则无变化。
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
int fd=open("./1.txt",O_RDWR | O_CREAT,0664);
if(fd<0)
{
perror("open!!");
return 0;
}
printf("before \n");
int ret=dup2(fd,1);
printf("after dup ret:%d \n ",ret);
return 0;
}
可以看到,通过dup2,printf并没有输出内容,函数将标准输出的内容重定向到了txt文件中。
四、
静态库、动态库
本质上文件,即为代码的集合,提供给第三方使用,提供库函数(二进制形式)
特性:库文件可以将代码分出模块,哪一块有问题,就单独编译那个模块就行
动态库:
后缀:
win:无前缀、后缀为dll;
linux:前缀为lib,后缀为. so
生成:gcc -fPIC -shared 源文件 -o 动态库文件(lib…… .so)
(fPIC:Position Independent Code 位置无关代码 )
使用:当编译一个可执行程序,其依赖于动态库文件时:
gcc 源文件 -o 可执行程序 -l动态库文件名
- L [path] :指定动态库所在的路径
- -l [动态库的名称(去掉前缀和后缀之后的名称) ] :指定编译可执行程序时, 依赖的动态库是那个。
- ldd 可执行程序名 :查看以来的动态库
在编译依赖于动态库的可执行程序时,必须让其找到动态库的位置,以下是几种方法:
1.当编译的可执行程序和动态库文件处于同一路径下时(不推荐将动态库和可执行程序放于一个路径下,显得文件目录凌乱):
gcc 源文件 -o 可执行程序 -L ./ -l动态库文件名 -L:指定动态库的存放路径
2. 配置LD_LIBRARY PATH,动态库的环境变量(推荐这样做):
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:(动态库的具体路径)
**查看环境变量:
$ echo $ LD_LIBRARY_PATH
即可查看我们配置的动态库路径是否已经添加到了环境变量中
3.将动态库的路径放入到 /lib64路径下 (极不推荐,这是系统的环境变量存放路径,不要放我们的业务文件。)
静态库:
后缀:
win:无前缀、后缀为 .lib
linux:前缀为 lib,后缀为 .a
生成:
一:gcc -c 生成目标程序(.o)
二:ar-rc libtest.a test.o
从而生成了 libtest.a静态库文件
*cd . 当前目录 cd .. 上级目录
使用:gcc main.c -o main -L . -ltest
此时使用 ldd main 查看依赖库并不会看到 静态库文件,因为在编译可执行文件时,静态库会直接被编译到可执行文件中。