1. 程式人生 > >C語言 execve()函式使用方法

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

這裡寫圖片描述

這裡寫圖片描述