博客
关于我
exec
阅读量:139 次
发布时间:2019-02-27

本文共 1289 字,大约阅读时间需要 4 分钟。

进程替换与exec族函数

1. exec族函数的作用

exec族函数用于将fork()生成的子进程的.text和.data段替换为目标进程的.text和.data段。这种机制被称为“换核不换壳”,因为在这个过程中并没有产生新的进程,而是直接替换了现有进程的内存空间。

2. Linux进程产生机制

在Linux系统中,进程的产生遵循以下步骤:

  • 编写一个helloworld程序:
  • // main.c#include 
    int main() { printf("Hello World!\n"); return 0;}
    1. 使用gcc编译:
    2. gcc -o main main.c
      1. 执行可执行文件:
      2. ./main

        在这一过程中,bash实际上是一个进程,而执行./main时,系统会调用fork()生成一个子进程。由于fork()创建的是一个完全独立的进程,子进程的虚拟地址空间与父进程几乎完全相同,包括.text和.data段。

        3. exec族函数的使用

        exec族函数用于替换子进程的.text和.data段,实现进程替换。常用的函数包括:

        • execl(const charpath, const charargv, ... , (char*)0)
        • execlp(const charfile, const charargv, ... , (char*)0)
        • execle(const charpath, const charargv, ... , char*const envp[])
        • execv(const charpath, charconst argv[])
        • execvp(const charfile, charconst argv[])

        这些函数的参数包括:

        • path:可执行文件的路径和名称,支持相对路径。
        • argv:传递给可执行文件的参数数组。
        • envp:环境变量数组,用于传递进程的环境。

        这些函数的特点是没有成功返回值,执行成功后不会返回。失败时返回-1,且调用失败后,程序会继续执行原始调用点。

        4. 伪代码示例

        if (pid == 0) {    // 子进程中    execlp("/bin/ls", "ls", "-a", NULL);}// 父进程中char *argv[] = {"ls", "-l", "-a", NULL};if (pid == 0) {    execv("/bin/ls", argv);}

        在上述伪代码中:

        • execlp("/bin/ls", "ls", "-a", NULL):使用execlp函数,指定可执行文件"/bin/ls"和参数数组。
        • argv数组初始化为{"ls", "-l", "-a", NULL}。
        • execv("/bin/ls", argv):使用execv函数,传递argv数组给可执行文件。

        这些函数不仅可以加载系统进程,也可以加载用户自定义的进程,使用方法相同。

        通过以上内容,可以看出进程替换的核心在于替换进程的.text和.data段,而不是创建新的进程。

    转载地址:http://xmyd.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现巴比伦平方根算法(附完整源码)
    查看>>
    Objective-C实现开方数(附完整源码)
    查看>>
    Objective-C实现异或密码算法(附完整源码)
    查看>>
    Objective-C实现快速排序算法(附完整源码)
    查看>>
    Objective-C实现打格点算法(附完整源码)
    查看>>
    Objective-C实现批量修改文件类型算法(附完整源码)
    查看>>
    Objective-C实现找出一个数的质因数primeFactors算法(附完整源码)
    查看>>
    Objective-C实现操作MySQL(附完整源码)
    查看>>
    Objective-C实现数组去重(附完整源码)
    查看>>
    Objective-C实现数组的循环左移(附完整源码)
    查看>>
    Objective-C实现数除以二divideByTwo算法(附完整源码)
    查看>>
    Objective-C实现文件分割(附完整源码)
    查看>>
    Objective-C实现文件的删除、复制与重命名操作实例(附完整源码)
    查看>>
    Objective-C实现时间戳转为年月日时分秒(附完整源码)
    查看>>
    Objective-C实现是否为 Pythagoreantriplet 毕氏三元数组算法(附完整源码)
    查看>>
    Objective-C实现显示响应算法(附完整源码)
    查看>>
    Objective-C实现普通矩阵A和B的乘积(附完整源码)
    查看>>
    Objective-C实现更新数字指定偏移量上的值updateBit算法(附完整源码)
    查看>>
    Objective-C实现最大类间方差法OTSU算法(附完整源码)
    查看>>
    Objective-C实现最大非相邻和算法(附完整源码)
    查看>>