IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux操作系统:重定向和动静态库的自实现 -> 正文阅读

[系统运维]Linux操作系统:重定向和动静态库的自实现

shell重定向的实现

之前博主完成了一个简单的shell命令程序:点击这里

但是这个函数是没有办法完成重定向功能的

echo “hello world” > hello.txt

当输入上述命令时,程序会发生报错。

程序更新后 如下:

  void redirect(char* cmd)
  {
    int fd = -1;
    int redirect_count = 0;
    char* ptr = cmd;
    char* file = NULL;
    while(*ptr)
    {
      if(*ptr == '>')
      {
        *ptr++ = '\0';
        redirect_count++;

        if(*ptr == '>')
        {
          *ptr++ = '\0';
          redirect_count++;
        }
        while(*ptr != '\0' && isspace(*ptr))                                                           
        {
          ptr++;
        }
        file = ptr;
        while(*ptr != '\0' && !isspace(*ptr))
        {
          ptr++;
        }
        *ptr = '\0';
  
        if(1 == redirect_count)
        {
          // >
          fd = open(file, O_CREAT | O_TRUNC | O_WRONLY, 0644);
        }
        else if(2 == redirect_count)
        {
          // >>
          fd = open(file, O_CREAT | O_APPEND | O_WRONLY, 0644);
        }
        else 
        {
          // do nothing
        }
        dup2(fd, 1);
        return;
      }
      ptr++;
    }
  }


上述程序仅为,重定向程序,另外注意需要把父进程解析命令行放入子进程中,要不然会发生重定向错误。

在这里插入图片描述
在这里插入图片描述
上述结果验证出所写代码的成功。

动静态库的实现

前言

//mylib.h

#include <stdio.h>
void Myprintf();

//mylib.c
#inlude "mylib.h"
void Myprintf()
{
	printf("Hello World\n");
}


接着要使用gcc -c生成.o文件,接着新建一个目录test,将mylib.o和,mylib.h文件拷贝至该目录下

在这里插入图片描述

接着在该目录下建立一个test.c文件,该文件就可以通过引入mylib.h的方式,调用Myprintf函数实现功能。需要注意的是编译时注意加入mylib.o文件,因为编译时依赖这个文件

在这里插入图片描述
如上其实就是一个库的雏形,其本质就是这样的。之所以要打包为.a文件是因为.o文件太多了,所以方便管理

静态库

现在我要实现一个静态库,我的库主要提供两个功能:加法运算和减法运算

依次创建add.c add.h sub.c sub.h四个文件


//add.h
#ifndef __ADD__
#define __ADD__
#include <stdio.h>
int add(int x,int y);
#endif

//add.c
#include "add.h”
int add(int x,int y)
{
	return x+y;
}

//sub.h
#ifndef __SUB__
#define __SUB__
#include <stdio.h>
int sub(int x,int y);
#endif


//add.c
#include "sub.h"
int sub(int x,int y)
{
	return x-y;
}


接着把所有的.c文件编译为对应的.o文件
在这里插入图片描述
使用ar -rc命令(rc表示replace and creat)打包静态库。

在这里插入图片描述
好的现在只需将头文件和.a文件交付给别人就可以使用了。所以要进行最后一次封装,创建一个目录 my_method,然后在该目录下分别创建两个目录:include和lib,将.h文件拷贝至include目录下,将.a文件拷贝至lib目录下

在这里插入图片描述

现在有个test.c想使用method,其程序如下


#include "add.h"    
#include "sub.h"    
    
int main()    
{    
  int x = 10;    
  int y = 20;    
  printf("%d\n", add(x,y));    
  printf("%d\n", sub(x,y));                                                                            
    
  return 0;    
} 

在这里插入图片描述

  • -I./method/include :告诉编译器去哪里寻找头文件
  • -L./method/lib:告诉编译器库在哪里
  • -lMYLIB:告诉编译器要使用哪个库(需要注意libmylib.a真正的库名是mylib)

PS:减法的函数+忘记改成-了,导致两者结果相同。

动态库

在这里插入图片描述

  • -fPIC,表示产生位置无关码
  • -shared选项,表示生成共享库格式

在这里插入图片描述
依照与静态库相同的编译方法(去掉-static)。

gcc -o test.exe test.c -I./my_method/include -L./my_method/lib -lMYLIB

但是这并不能完成test的运行。

**这是因为,动态库和静态库不同,动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。**所以编译器的确知道我们的库在哪,但是操作系统并不知道,所以要让操作系统知道这个路径才可以。

换句话来说,动态库需要操作系统将其导入内存,但是操作系统不知道其路径,用环境变量设置即可:

类比于环境变量PATH,操作系统也有这样的环境变量,以供操作系统搜索动态库:LD_LIBRARY_PATH。所以我们要把当前库的绝对路径导入到该环境变量之中。


export LD_LIBRARY_PATH=/home/qqhsj/file/807/dir/as/so_method/lib

在这里插入图片描述
导入后就可以正常运行啦。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:35:59  更:2021-08-09 10:36:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 12:12:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码