IT评测·应用市场-qidao123.com技术社区

标题: Linux笔记---进程:进程替换 [打印本页]

作者: 篮之新喜    时间: 2024-12-9 22:32
标题: Linux笔记---进程:进程替换
1. 进程替换的概念

进程替换是指在一个正在运行的进程中,用一个新的程序替换当进步程的代码和数据,使得进程开始实行新的程序,而不是原来的程序。
这种技术通常用于在不创建新进程的情况下,改变进程的行为。
我们之前谈到过fork函数,这个函数可以启动一个子进程,子进程继承了父进程的代码和数据。
在谈到进程替换之前,我们只能通过判断fork函数的返回值id来区分父子进程,并让二者运行不同的分支。而利用进程替换技术,我们可以将子进程的代码数据完全替换为另一个程序,实现我们所盼望的,父子进程完全独立为两个不同的进程。
进程替换的原理

进程替换的原理涉及到操作体系的内存管理和进程控制。当一个进程调用exec系列函数时,操作体系会将新程序的代码和数据加载到内存中,并将其与当进步程的地址空间相关联。这个过程通常涉及到以下几个步调:
     在这个过程中,进程的标识符(PID)和其他一些属性(如打开的文件描述符、环境变量等)通常会保持不变。
2. exec进程替换函数

在Linux体系中,进程替换通常通过exec系列函数来实现,该系列函数包罗在头文件<unistd.h>。
这些函数包罗:
   
  这些函数的使用方式和参数传递方式略有不同,但它们的基本功能都是相同的:用新程序替换当进步程的代码和数据。
记忆本事:
   
  使用示例:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. int main()
  4. {
  5.     char* vector[] = {"ls", "-l", "-a", NULL};
  6.     int id = fork();
  7.     if(id == 0)
  8.     {
  9.         execvp("ls", vector);
  10.         return 0;
  11.     }
  12.     int pid = wait(NULL);
  13.     return 0;
  14. }
复制代码
 注意:传入的参数为命令行参数,也就是说在命令行要实行该程序需要输入什么,参数就传递什么,主要是不要忘记选项是从第二个参数开始的。
第一个参数传什么都不要紧,随你喜欢,但要记得传:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. int main()
  4. {
  5.     char* vector[] = {"cxk", "-l", "-a", NULL};
  6.     int id = fork();
  7.     if(id == 0)
  8.     {
  9.         execvp("ls", vector);
  10.         return 0;
  11.     }
  12.     int pid = wait(NULL);
  13.     return 0;
  14. }
复制代码
execve函数

该函数相比于其他函数具有一定的特殊性,他是上述函数中唯一一个体系调用。
在命令行输入[man exec]能查到如下信息,可以看到并没有execve的存在,且这些函数都在3号手册当中:

只有单独查询execve函数时才气查到,可以看到该函数在2号手册(体系调用接口)中:

 execve函数的特殊性:
      exec函数族调用关系如下:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4