C语言 execve()函数使用方法

1.君の名は

execve() – 叫做执行程序函数

就像Python中的os.system(cmd)这个函数,我们可以用这个函数来执行我们的shell脚本,单独的shell命令,或者是调用其他的程序,我们的execve()这个函数就和Python中的os.system函数类似,可以调用其他程序的执行,执行shell命令,,调用脚本等等功能。


2.定义

我们在使用这个函数的时候我们需要在程序中加入头文件

#include <unistd.h>

函数的原型:


int execve(const char *filename, char *const argv[], char *const envp[]); 

3.描述

int execve(const char *filename, char *const argv[], 
           char *const envp[]); 

execve()执行程序由 filename决定。
filename必须是一个二进制的可执行文件,或者是一个脚本以#!格式开头的解释器参数参数。如果是后者,这个解释器必须是一个可执行的有效的路径名,但是不是脚本本身,它将调用解释器作为文件名。


argv是要调用的程序执行的参数序列,也就是我们要调用的程序需要传入的参数。

envp 同样也是参数序列,一般来说他是一种键值对的形式 key=value. 作为我们是新程序的环境。

注意,argv 和envp都必须以null指针结束。 这个参数向量和我们的环境变量都能够被我们的main函数调用,比如说我们可以定义为下面这个形式:

 int main(int argc, char *argv[], char *envp[])

我们来实战一下这个函数要怎么使用。


4.调用

4.1执行shell命令


/*************************************************************************
    > File Name: caller.c
    > Author: Chicho
    > Created Time: 2016年12月06日 星期二 11:31:12
 ************************************************************************/

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

int main(int arg, char **args)
{
    char *argv[]={"ls","-al","/home/chicho/result/", NULL};

    char *envp[]={0,NULL}; //传递给执行文件新的环境变量数组

    execve("/bin/ls",argv,envp);

}

这个程序的功能就是使用ls 查看我们/home/chicho/result下面的文件夹的内容。
我们编译运行以下
得到的结果如下:

这里写图片描述

这个程序的功能相当于在/home/chicho/result下使用:

ls -al

4.2 调用其他程序

调用Python程序

首先程序要有可执行权限,我们需要用chmod修改一下。

比如说我们的Python程序叫做test.py

#!/usr/bin/env python
# coding=utf-8

print "hello, world!\n"

这个时候我们用我们的C程序调用我们的python程序。执行。


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

int main(int arg, char **args)
{
    char *argv[]={"python","/home/chicho/test/python/test.py",NULL};
    char *envp[]={0,NULL};

    execve("/usr/bin/env",argv,envp);
}

4.3 调用二进制可执行程序

/*

*  execve.c

*/

#include<unistd.h>
int main()
{
   char * argv[ ]={"./test","test_sample",(char *)0};
   char * envp[ ]={0};
   execve("./test",argv,envp);

   return 0;
}
/*

* test.c

*/

#include <stdio.h>
int main(int narg,char **args)
{

   if(narg != 2)

   {

       printf("error,the input parameter must be one!\n");
       return -1;
   }
   char *str = args[1];
   printf("the input parameter is %s\n",str);
   return 0;
}

cc -g -o test test.c

生成test应用程序

然后

cc -g -o execve execve.c

生成execve应用程序

执行./execve即可调用test应用,输出

test_sample


Reference

http://www.tutorialspoint.com/unix_system_calls/execve.htm








这里写图片描述



这里写图片描述






  • 43
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c语言提供了一些用于进程操作的相关函数。下面简要介绍几个常用的函数。 1. fork()函数:该函数用于创建新的进程。调用该函数会复制当前进程,使得原进程和新进程同时运行。原进程称为父进程,新进程称为子进程。父子进程的代码段和全局变量相同,但拥有独立的栈空间和唯一的进程ID。 2. exec()函数族:exec函数族用于在一个进程中执行新的程序。这些函数会在调用进程的地址空间中加载新的程序,并开始执行。exec函数族的几个常用函数有:execv()、execvp()、execve()。这些函数通过传递命令行参数、环境变量等信息,用新程序替换当前进程。 3. wait()函数:该函数用于使父进程等待子进程执行结束,并获取其退出状态。当子进程终止时,父进程可以根据wait函数返回的状态信息,判断子进程的终止方式和退出状态。如果子进程尚未终止,调用wait函数会使父进程阻塞,直到有子进程结束。 4. kill()函数:该函数用于向指定的进程发送信号。进程之间可以通过信号来通信,比如终止进程、暂停进程等。kill函数通过指定目标进程的进程ID和信号编号,向目标进程发送信号。 5. getpid()函数:该函数用于获取当前进程的进程ID。每个进程有唯一的进程ID,可以通过getpid函数获取该进程ID。这对于进行进程管理和进程间通信很有用。 总之,C语言提供了丰富的进程操作相关函数,可以用于创建、替换、等待进程,以及发送信号等操作。这些函数为进程管理和进程间通信提供了丰富的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值