Linux 基础IO2

本文详细解析了文件重定向的两种方式——清空重定向(>)与追加重定向(>>),并从内核角度剖析其实现机制。通过`dup2`函数实例展示重定向功能,区分静态库与动态库的区别及其在程序中的应用。
摘要由CSDN通过智能技术生成

一、

重定向概述:

         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 查看依赖库并不会看到 静态库文件,因为在编译可执行文件时,静态库会直接被编译到可执行文件中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值