Linux进程控制2

进程程序替换:

1.为什么要使用进程程序替换:

父进程创建子进程时,子进程与父进程的代码段相同,

实例:

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

int main()
{
 pid_t ret=fork();
 printf("i am Proc \n");

return 0;
}

 

由此可见子进程和父进程执行的结果一致。如果我们想让子进程执行不同的结果时,就让其调用进程程序替换的接口,从而让其执行不一样的代码

2.进程程序替换的原理:

不创建新的进程,替换正在运行的进程,仅仅替换进程的代码块、数据段,并且更新堆栈。

da 

3.实现的函数:

exec函数簇:

 (1)int execl(const char* path,const char *arg……)

参数:

path:带有路径的可执行程序(需要路径),替换为该程序

 arg:给程序传递命令行参数 

        第一个命令行参数是程序本身

        最后一个参数以NULL结尾

返回值:

成功没有返回值,这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。

失败:返回-1;

调用错误 

调用成功了!

 (2)int execlp(const char *file,const char *arg ……)

参数:

file:可执行程序,路径可带可以不带

arg:传递给可执行程序的命令行参数,第一个参数是可执行程序本身,以NULL结尾

返回值:

成功就加载调用的程序并开始执行

错误:返回-1

**若函数名中带有“p”,可以使用环境变量,无需全写路径,即函数会自动搜索可执行程序,不用写路径。

     若函数中带有“l”,传递给可执行程序的参数是以可变参数列表的方式传递的

        第一个参数:需要可执行程序本身

        若需要传递多个参数,使用“ ,”进行隔离,参数列表的末尾以NULL结尾。

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

int main()
{
printf("i am main \n ");
int ret=execlp("test","test",NULL);
if(ret<0)
{
perror("execlp error");
printf("cannot see this line ");

}
return 0;
}
~  

 执行成功

 

 

(3)   int  execle(const char *path,const char *arg, …… char *const envp[])

        参数:

path:带路径的可执行程序。

arg:传递给可执行程序的命令,第一个参数是可执行程序本身, 若需要传递多个参数,使用“ ,”进行隔离,参数列表的末尾以NULL结尾。

envp:传递的环境变量,需要自己组织环境变量。

返回值:成功则直接从调用的函数开始 

失败:返回-1

**若函数名中带有 “ e”,则调用该函数时,需要自己传入环境变量。

执行错误:

 

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

int main()
{
printf("i am main \n ");
int ret=execle("/usr/bin/ls","-ls",NULL,NULL);
if(ret<0)
{
 perror("excle error");
return 0;
printf("cannot print this line! \n");
}
return 0;
}

执行成功

 (4)int execv(const char *path,char *const argv[])

参数:

path:带路径的可执行程序

argv: 第一个是传递给可执行程序的命令行参数,多个参数就放入到数组中,末尾以NULL结尾

返回值:

成功就从新加载的函数执行

失败:返回-1

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

int main()
{
char *arr[10]={NULL};
arr[0]="ls";
arr[1]=NULL;

int ret=execv("/usr/bin/ls",arr);
if(ret<0)
{
 perror("execv !");
printf("cannot printf thie line! ");
return 0;
}
return 0;
}
~          

 执行成功

(5)

 int execve(const char *path,char *const argv[],char *coosnt envp[])

 参数:

path:带路径的可执行程序(必须携带)

argv:传递给可执行程序的参数,以指针数组的形式传递

第一个参数:可执行程序自身,其余的参数放入数组 argv中,末尾以NULL结束

envp:需要传入的环境变量,需自行组织。

返回值:

成功则直接进入调用的函数执行

失败:返回-1;

 传入的参数少了环境变量。

environ:

 每个程序都收到一个环境表,其是一个字符指针数组,每个指针指向一个以‘ \0’结尾的环境字符串

获取环境变量:
 

#include<stdio.h>

int main(int argc,char *argv[],char *env[])
{       
    int i=0;
    for(;env[i];i++)
    {  
      printf("%s \n",env[i]);
    }
return 0;
}

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

int main()
{
 extern char **environ;
 char *p[10]={NULL};
 p[0]="pwd" ;
 p[1]=NULL;

 int ret=execve("/usr/bin/pwd",p,environ);
 if(ret<0)
{
 perror("execve error");
 printf("cannot printf this line!");
return 0;
}
return 0;
}

 成功调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值