进程程序替换

本文详细介绍了Linux系统中的进程替换原理,包括各种exec函数的使用,如execl、execv、execlp等。此外,还展示了简易Shell的制作过程,探讨了如何利用execvp函数执行命令以及如何处理环境变量。在Shell中,通过chdir函数实现路径切换,而putenv接口用于在Shell内部添加新的环境变量。
摘要由CSDN通过智能技术生成

目录

一.替换原理

二.替换函数

 三.简易shell的制作


一.替换原理

fork 创建子进程后执行的是和父进程相同的程序 ( 但有可能执行不同的代码分支 ), 子进程可以用过要调用一种 exec 函数去执行另一个程序。当进程调用一种exec 函数时 , 该进程的用户空间代码和数据完全被新程序替换 , 从新程序的启动例程开始执行。
调用 exec 并不创建新进程 , 所以调用 exec 前后该进程的id没有改变。

二.替换函数

一共有6中替换函数 ,统称为exec函数。

#include <unistd.h>`
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const cha *file,char *const argv[]);

这些函数如果调用成功,则会加载新的程序从启动代码处开始执行。如果调用失败了会返回-1。

要执行一个全新的程序,首先要找到该程序的位置,以及怎么去执行,可以认为这些就是参数。

举例子看一下: 

1.execl:第一个参数是执行参数的路径,第二个参数是可变参数列表,表示你如何执行这个程序,并以NULL结尾。

int main()
{
  pid_t id=fork();
  if(id==0)
  {
      printf("我是子进程,我的id=%d\n",getpid());
      execl("/usr/bin/ls","ls","-a","-l",NULL);
      //execl("./T","T",NULL); //也可运行自己写的程序

      printf("我已经执行完毕\n");
  }
  else
  {
    int status=0;
    int ret=waitpid(id,&status,0);
    sleep(2);
   if(ret>0)
    {
       printf("退出信号是%d,退出码是%d\n",(status>>8)&0xFF,status&0xFF); 
       printf("等待成功\n");

    }
  
  }
  return 0;
}

[LF@ecs-100710 lesson7]$ ./t
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值