文章目录

  • 重定向
    • 重定向的符号
    • 从内核角度理解重定向
    • 重定向的接口dup2函数
  • 动态库和静态库
    • 动态库
    • 静态库
  • 软链接
  • 硬链接

重定向

重定向的符号

“>”:清空重定向
“>>”:追加重定向

从内核角度理解重定向

在进程的结构体中,有一个描述进程打开文件的信息的结构体指针(struct file_struct *files;),该结构体指针指向一个结构体(struct file _struct{…}),这个结构体里面有一个结构体(struct file * fd_array[NR_OPEN_DEFAULT]),该结构体保存一个指针数组,可以理解为一个文件描述符表,里面保存的是当前进程打开文件的信息,我们所说的文件描述符就是该指针数组的下标,该指针数组里面保存的指针变量是一个结构体指针(struct file *),该指针指向一个结构体(struct file{…}),这个结构体是描述文件具体信息的。

重定向就是将struct file *这个结构体指针的指向改变成为另外一个struct file结构体。也就是说,从指向某一个文件改变为指向另一个文件。

重定向的接口dup2函数

函数原型:

int dup2(int oldfd, int newfd);

作用:将newfd的值重定向为oldfd,即newfd拷贝oldfd
参数:newfd和oldfd都是文件描述符
执行成功:第一关闭newfd,让newfd指向oldfd对应的struct file*结构体
执行失败:1、如果oldfd是一个非法或者是无效的文件描述符,则重定向失败,newfd没有变化;2、如果oldfd和newfd的值相等,则什么事情都不干。

代码验证:
将标准输出重定向为a.txt文件。

#include <stdio.h>2 #include <unistd.h>3 #include <fcntl.h>4 int main()5 {6   //让标准输出流指向a.txt文件7   int fd =open("./a.txt",O_RDWR | O_CREAT,0664);8   if(fd < 0){9     perror("fopen");10     return 0;11   }12 13   printf("before dup2:hello world\n");14 15   /*16    * oldfd:fd 17    * newfd:1  将一号标准输出重定向到fd对应的文件18    * 1  要进行指向更新19    */20   dup2(fd,1);21   printf("after dup2:hello world.\n");                                                         22   return 0;23 }

动态库和静态库

静态库和动态库都是文件,称之为库文件,用来保存程序代码,在编译一个程序的时候,所链接的库都是独立进行编译的,所以库文件可以将代码分模块出来,哪个模块有问题就修改哪个模块。
什么是库?静态库和动态库都是程序代码的集合。一般为了方便将程序提供给第三方使用,就是将程序编写成为库文件提供给第三方使用,优点首先就是不会泄漏公司的源码,其次就是调用者不用关心库文件内部实现,只需要关注如何调用即可。

动态库

特征:

  • Windows系统下:没有前缀,后缀为dll
  • Linux系统下:前缀为lib,后缀为.so

生成:
使用gcc/g++编译器,增加两个命令行参数:-fPIC和-shared,生成动态库的代码当中不需要包含main函数(程序入口函数)。

动态库的生成测试:

hello.h代码:

 #pragma once 2 #include <stdio.h>3 4 void PrintHello();
~

hello.c代码:

 #include "hello.h"2 void PrintHello(){3   printf("exec hello.c:hello world.\n");                                                       4 }
~

动态库的使用测试:

编译器在进行链接的时候找不到对应函数的实现,所以报错,编译终止。所以我们下面就得告诉编译器对应函数的实现在哪。

为了解决上面的问题,我们告诉了编译器依赖的动态库是哪一个,但是又出现了新的问题,编译器找不到动态库的路径,于是我们又说明了动态库的路径,所以在使用动态库的时候需要注意下面两点:

编译可执行程序的时候,依赖动态库。
-L[path]:指定动态库所在的路径
-l[动态库的名称,去掉前缀和后缀]:指定编译可执行程序时,依赖的动态库时哪一个。

现在我们就执行成功啦!完成了动态库的生成和动态库的使用的测试!

上面我们将mymain所依赖的动态库放到了可执行程序的路径下,可执行程序可以正常执行,但是如果我们将这个动态库从该路径移除呢?

mymain这个可执行程序已经不能执行了,原因是程序找不到动态库,那都有哪些方法可以解决这个问题呢?

  • 将动态库放到可执行程序的路径下,不过不推荐
  • 配置LD_LIBRARY_PATH,这个环境变量就是动态库的环境变量
  • 放到系统库的路径下:/lib64,不过非常不推荐这样做

我们现在来解决一下上面这个问题,配置一下LD_LIBRARY_PATH这个环境变量。


静态库

特征:

  • Windows系统下:没有前缀,后缀为.lib
  • Linux系统下:前缀为lib,后缀为.a

生成:

  • 第一阶段:使用gcc或者g++将源代码编译成为目标程序(.o)
  • 第二阶段:使用ar -rc命令编译目标程序成为静态库

注意:如果直接使用源代码编译是不行的.

代码测试过程和动态库类似,注意命令不同,就不赘述了。

生成可执行程序的过程中需要依赖动态库或者静态库的时候,编译的时候一定要加上-l[库名]

软链接

软链接其实就是目标文件的快捷方式。
生成软链接:ln -s 源文件 软链接文件

注意事项:

修改软链接文件,源文件也会修改;
删除源文件的时候软链接文件内容会被清空。
源文件如果被删除,软链接文件还在的,如果修改软链接文件,那么会重新建立源文件,重新建立链接关系,所以删除源文件的时候,一定要将软链接文件也一起删除。

硬链接

硬链接是目标文件的替身。
生成硬链接:
ln 源文件 硬链接文件

硬链接的inode节点和源文件一致,软链接的inode节点和源文件不一致。

【Linux】基础IO2相关推荐

  1. 一键检查LINUX基础环境

    一键检查LINUX基础环境 搞这个脚本的初衷: 每次我部署完环境,都得认真慢慢检查一般,有点费劲,一直想搞个像样的一键检查脚本,这不,可算抽空打个样了. [root@z4 ~]# sh bench.s ...

  2. 小猿圈Linux基础面试题,看看你能答对几道?

    最近身边的很多朋友都在学习linux,从最开始的安装软件都需要百度一天的他们,现在已经成长为了,不需要百度就可以把自己弄懵圈的了,接下来的几天小猿圈linux老师会为大家准备一些实用的linux技巧分 ...

  3. linux基础知识-链接列表

    linux基础知识-链接列表 1. 安装centos 7 1.1 Linux的初识 1.2 centOS 7安装教程 1.3 centOS 7配置ip和网络问题排查 1.4 PuTTY和Xshell远 ...

  4. linux基础知识_压缩—进程管理-网络管理-ftp-nfs-ssh-scp

    linux基础知识_压缩-进程管理-网络管理-ftp-nfs-ssh-scp 1.压缩包管理 gzip .gz格式的压缩包,不打包,分别压缩,原文件消失 bzip2 .bz2格式的压缩包,原文件不会消 ...

  5. 《嵌入式 Linux应用程序开发标准教程(第2版)》——第1章 Linux快速入门 1.1 嵌入式Linux基础...

    本节书摘来自异步社区<嵌入式 Linux应用程序开发标准教程(第2版)>一书中的第1章,第1.1节,作者 华清远见嵌入式培训中心,更多章节内容可以访问云栖社区"异步社区" ...

  6. linux基础概念和个人笔记总结(6)

    防伪码:曾经梦想仗剑走天涯,回过头,却发现还是放不下家的牵挂 后续理论的验证图文详解,我会更新,希望大家可以参考 第十一章 FTP文件传输服务 1.FTP连接 控制连接:tcp21端口,用于发送ftp ...

  7. Linux基础第一周

    Linux基础第一周 命令的格式 command(命令)option(选项)arguments(参数)三部分组成,之间需要空格间隔 options 选项 启用命令的某项功能,从而更改命令的功能 arg ...

  8. 20155301 滕树晨linux基础——linux进程间通信(IPC)机制总结

    20155301 滕树晨linux基础--linux进程间通信(IPC)机制总结 共享内存 共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在 ...

  9. 鸟哥的linux 实训教程,鸟哥的Linux基础学习实训教程

    1.理想的Linux上机实践课程 每周一次.每次三小时的学与练 本书所有例题讲解,均经过鸟哥在大专院校实施多年来的测试,对于学生的理解具有相当满意的效果. 2. 提供一致性教学环境 让学习者不再有陌生 ...

  10. 第90节:Java中的Linux基础

    第90节:Java中的Linux基础 linux是装载虚拟机上面的: JDK依赖包: yum install glibc.i686MYSQL依赖包: yum -y install libaio.so. ...

最新文章

  1. DETR3D:将DETR用于3D目标检测任务
  2. scrapy 分布式爬虫- RedisSpider
  3. mysql存储过程和自定义函数
  4. SAP云平台与企业数字型转型
  5. 洛谷P4325、P4413题解(Java语言描述)
  6. 三层结构下的DBHelper方法
  7. Git版本控制:Git分支处理
  8. Spring的注入方式中,官方推荐哪种方式
  9. eclipse 字体设置
  10. 高格虚拟服务器,网络相关 篇一:利用Windows自带的HyperV,安装高恪x86软路由
  11. NAT64与DNS64基本原理概述
  12. 屌炸天的3D引擎OpenCASCADE的用法及案例
  13. SQL注入案例演示与防范措施大全
  14. 计算机组装在线作业_1,中石油华东《计算机维护技术》2018年秋学期在线作业(三).doc...
  15. 神经网络实现鸢尾花分类(Tensorflow2.0)
  16. 在瑞芯微ok3568平台利用python实现Can通讯
  17. HDF5 windows编译 release版本、Debug版本
  18. word 中Visio画的图 如何修改?图片排列
  19. 半球展开图_新手入门如何学习钣金放样展开,老师傅分享篇(二)!
  20. html5 meter样式,css – Chrome中的HTML5 Meter样式

热门文章

  1. Esp8266 进阶之路21 【高级篇】浅谈 esp8266 如何在本地局域网网络情况下实现最大效率地和前端实现数据交互。(附带Demo)
  2. java对接银联商务公众号+服务窗支付(1)
  3. DIY便携式肖像绘图机
  4. Python在生物学领域的简单应用——处理DNA序列
  5. “开-闭”原则(Open-Closed Principle)
  6. Etherum进行Pos合并后该如何选择ETH质押服务?
  7. 阿里云phpsdk的使用方法
  8. 事后控制不如事中控制,事中控制不如事前控制 。
  9. 三国游戏(贪心算法)
  10. EVT、DVT、PVT、MP是什么意思