使用 exec*库函数、编程练习动态链接库的两种使用方式

blog_week08

  • [编程使用 exec*库函数加载一个可执行文件,编程练习动态链接库的两种使用方式](#编程使用 exec*库函数加载一个可执行文件,编程练习动态链接库的两种使用方式)
  • [一、 编程使用 exec*库函数加载一个可执行文件](#一、 编程使用 exec*库函数加载一个可执行文件)
  • [二、 编程练习动态链接库的两种使用方式](#二、 编程练习动态链接库的两种使用方式)

编程使用 exec*库函数加载一个可执行文件,编程练习动态链接库的两种使用方式

一、 编程使用 exec*库函数加载一个可执行文件

exec*函数族涵盖了一系列函数,其中包括:execl、execle、execlp、execv、execve、execvp、execvpe。

这些函数允许你加载一个新的程序并执行它,允许传递参数列表和环境变量。每个函数都有特定的用途和参数列表。

这里写了两个C语言代码,进行使用exec*库的使用(这里用的是execve函数)。

execve 函数被用于装载并执行新的程序,它允许传递参数列表给新程序,并可以指定环境变量。

以下代码打印出了传递给它的命令行参数列表。其中,myecho.c打印出传递给它的命令行参数列表,myexecve.c 使用 execve 函数调用来加载一个新的程序,即myecho,它的名字(myecho)作为 myexecve 的第一个参数传入,接着便是list1[]中的其他数据被打印。

c 复制代码
// myecho.c:

//打印命令行参数
#include<stdio.h>
#include<unistd.h>

#include<stdlib.h>

int main(int argc,char*argv[]){
        for(int i=0;i<argc;i++){
                printf("argv[%d]:%s\n",i,argv[i]);
        }
        exit(EXIT_SUCCESS);
}                                                                                        
c 复制代码
// myexecve.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(int argc,char* argv[]){
        //这里的结尾必须加NULL 否则调用execve会报Bad address错误
        char*list1[]={NULL,"Hello","Linux","World",NULL};
        char*list2[]={NULL};
        //参数数量必须为2 不为2报错
        if(argc!=2){
                fprintf(stderr,"%s wrong",argv[0]);
                exit(EXIT_FAILURE);
        }
        //将list1第一个参数放为刚刚的那个echo文件的文件名
        list1[0]=argv[1];
        //execve
        execve(argv[1],list1,list2);
        perror("execve");
}

编译并运行,实现调用:

c 复制代码
gcc myecho.c -o myecho
gcc myexecve.c -o myexecve
./myexecve ./myecho

二、 编程练习动态链接库的两种使用方式

首先,创建一个共享库,用于被这2种方法调用。再创建两个C语言代码,分别实现可执行程序装载时动态链接和运行时动态链接。

shared_lib.c是一个共享代码库,用于被调用链接。

main_exec_link_time.c 是使用可执行程序装载时的方法实现动态链接。

main_run_time.c 是使用运行时动态链接方法实现动态链接。

三个文件的代码如下:

c 复制代码
// shared_lib.c - 共享库代码

#include <stdio.h>

void my_function() {
    printf("动态共享链接库成功被调用!\n");
}
c 复制代码
// main_exec_link_time.c - 使用可执行程序装载时动态链接

#include <stdio.h>

extern void my_function(); // 引用共享库中的函数

int main() {
	printf("该方法是------使用可执行程序装载时动态链接!\n");
    my_function();
    return 0;
}
c 复制代码
// main_run_time.c - 使用运行时动态链接

#include <stdio.h>
#include <dlfcn.h>

int main() {
    void *handle;
    void (*my_function)();

    handle = dlopen("shared_lib.so", RTLD_LAZY); // 指定共享库的路径

    if (!handle) {
        fprintf(stderr, "%s\n", dlerror());
        return 1;
    }
	
	printf("该方法是------使用运行时动态链接!\n");	
	
    // 获取共享库中的函数指针
    my_function = dlsym(handle, "my_function");
    my_function(); // 执行共享库中的函数
    dlclose(handle); // 关闭共享库

    return 0;
}

首先,先编译shared_lib.c共享库代码成为共享库shared_lib.so,使用以下代码:

bash 复制代码
gcc -shared -o shared_lib.so -fPIC shared_lib.c

其次,使用以下代码编译并实现可执行程序装载时动态链接:
特别注意,export LD_LIBRARY_PATH=$PWD是环境变量,如果能通过编译却执行报错就必须加这一行,原因如下:

"export LD_LIBRARY_PATH=$ PWD"

这个命令会设置环境变量 LD_LIBRARY_PATH 为当前工作目录,用于指定动态链接器的库搜索路径。当程序在运行时需要动态链接共享库时,它会查找 LD_LIBRARY_PATH 中指定的路径,其中包含了动态链接库(.so 文件)的位置。将其设置为当前工作目录($PWD)会让动态链接器搜索并加载当前工作目录中的共享库。

bash 复制代码
export LD_LIBRARY_PATH=$PWD
gcc main_exec_link_time.c -o exec_link_time -L. shared_lib.so
./exec_link_time

最后,使用以下代码编译并实现运行时动态链接

bash 复制代码
gcc main_run_time.c -o run_time -ldl
./run_time

完成

相关推荐
萧鼎5 分钟前
深入解析 Python 的 pytun 库:虚拟网络接口与隧道技术实战指南
服务器·网络·python
Re_Yang0920 分钟前
2025年统计与数据分析领域专业认证发展指南
服务器·人工智能·数据分析
牛奶咖啡131 小时前
从零到一使用Linux+Nginx+MySQL+PHP搭建的Web网站服务器架构环境——LNMP(上)
linux·lnmp·ngnix的源码安装部署·mysql的二进制文件安装部署·php源码的安装部署·记录并解决安装php的各种问题
软件测试很重要1 小时前
UOS20系统安装与 SSH/XRDP 远程访问功能配置指南
linux·运维·ssh
对你无可奈何2 小时前
关于Ubuntu的 update造成的内核升级
运维·服务器·ubuntu
GanGuaGua2 小时前
Linux系统:线程的互斥和安全
linux·运维·服务器·c语言·c++·安全
lsnm3 小时前
【LINUX网络】IP——网络层
linux·服务器·网络·c++·网络协议·tcp/ip
不掰手腕3 小时前
在UnionTech OS Server 20 (统信UOS服务器版) 上离线安装PostgreSQL (pgsql) 数据库
linux·数据库·postgresql
Lynnxiaowen3 小时前
今天继续昨天的正则表达式进行学习
linux·运维·学习·正则表达式·云计算·bash
努力学习的小廉4 小时前
深入了解linux系统—— POSIX信号量
linux·运维·服务器