当前位置: 技术问答>linux和unix
我想在linux下写一个c程序调用linux的可执行文件或者程序,怎么做?
来源: 互联网 发布时间:2014-12-05
本文导语: 我想在linux下写一个c程序调用linux的可执行文件或者程序,怎么做? | 这些函数之间的第一个区别是前四个取路径名作为参数,后两个则取文件名作为参数。当指定f i l e n a m e作为参数时...
我想在linux下写一个c程序调用linux的可执行文件或者程序,怎么做?
|
这些函数之间的第一个区别是前四个取路径名作为参数,后两个则取文件名作为参数。当指定f i l e n a m e作为参数时:
• 如果f i l e n a m e中包含/,则就将其视为路径名。
• 否则就按PAT H环境变量,在有关目录中搜寻可执行文件。
PATH变量包含了一张目录表(称为路径前缀),目录之间用冒号( : )分隔。例如下列n a m e = v a l u e环境字符串:
P A T H = / b i n : / u s r / b i n : / u s r / l o c a l / b i n :.
指定在四个目录中进行搜索。(零长前缀也表示当前目录。在v a l u e的开始处可用:表示,在行中间则要用::表示,在行尾以:表示。)
有很多出于安全性方面的考虑,要求在搜索路径中决不要包括当前目录。请
参见Garfinkel 和S p a fford [1991] 。
如果e x e c l p和e x e c v p中的任意一个使用路径前缀中的一个找到了一个可执行文件,但是该文件不是由连接编辑程序产生的机器可执行代码文件,则就认为该文件是一个s h e l l脚本,于是试着调用/ b i n / s h,并以该f i l e n a m e作为s h e l l的输入。
第二个区别与参数表的传递有关( l表示表( l i s t ),v表示矢量( v e c t o r ) )。函数e x e c l、e x e c l p和e x e c l e要求将新程序的每个命令行参数都说明为一个单独的参数。这种参数表以空指针结尾。对于另外三个函数( e x e c v, e x e c v p和e x e c v e ),则应先构造一个指向各参数的指针数组,然后将该数组地址作为这三个函数的参数。
在使用ANSI C原型之前,对e x e c l , e x e c l e和e x e c l p三个函数表示命令行参数的一般方法是:
char * a rg 0, char *a rg 1, ..., char * a rg n, (char *) 0
应当特别指出的是:在最后一个命令行参数之后跟了一个空指针。如果用常数0来表示一个空指针,则必须将它强制转换为一个字符指针,否则它将被解释为整型参数。如果一个整型数的长度与char *的长度不同,e x e c函数实际参数就将出错。
最后一个区别与向新程序传递环境表相关。以e结尾的两个函数( e x e c l e和e x e c v e)可以传递一个指向环境字符串指针数组的指针。其他四个函数则使用调用进程中的e n v i r o n变量为新程序复制现存的环境。通常,一个进程允许将其环境传播给其子进程,但有时也有这种情况,进程想要为子进程指定一个确定的环境。例如,在初始化一个新登录的s h e l l时, l o g i n程序创建一个只定义少数几个变量的特殊环境,而在我们登录时,可以通过s h e l l起动文件,将其他变量加到环境中。在使用ANSI C 原型之前, execle 的参数是:
char * p a t h n a m e, char *a rg 0, ⋯, char *a rg n, (char *)0, char * e n v p[ ]
从中可见,最后一个参数是指向环境字符串的各字符指针构成的数组的指针。而在ANSI C原型中,所有命令行参数,包括空指针, e n v p指针都用省略号(⋯)表示。
• 如果f i l e n a m e中包含/,则就将其视为路径名。
• 否则就按PAT H环境变量,在有关目录中搜寻可执行文件。
PATH变量包含了一张目录表(称为路径前缀),目录之间用冒号( : )分隔。例如下列n a m e = v a l u e环境字符串:
P A T H = / b i n : / u s r / b i n : / u s r / l o c a l / b i n :.
指定在四个目录中进行搜索。(零长前缀也表示当前目录。在v a l u e的开始处可用:表示,在行中间则要用::表示,在行尾以:表示。)
有很多出于安全性方面的考虑,要求在搜索路径中决不要包括当前目录。请
参见Garfinkel 和S p a fford [1991] 。
如果e x e c l p和e x e c v p中的任意一个使用路径前缀中的一个找到了一个可执行文件,但是该文件不是由连接编辑程序产生的机器可执行代码文件,则就认为该文件是一个s h e l l脚本,于是试着调用/ b i n / s h,并以该f i l e n a m e作为s h e l l的输入。
第二个区别与参数表的传递有关( l表示表( l i s t ),v表示矢量( v e c t o r ) )。函数e x e c l、e x e c l p和e x e c l e要求将新程序的每个命令行参数都说明为一个单独的参数。这种参数表以空指针结尾。对于另外三个函数( e x e c v, e x e c v p和e x e c v e ),则应先构造一个指向各参数的指针数组,然后将该数组地址作为这三个函数的参数。
在使用ANSI C原型之前,对e x e c l , e x e c l e和e x e c l p三个函数表示命令行参数的一般方法是:
char * a rg 0, char *a rg 1, ..., char * a rg n, (char *) 0
应当特别指出的是:在最后一个命令行参数之后跟了一个空指针。如果用常数0来表示一个空指针,则必须将它强制转换为一个字符指针,否则它将被解释为整型参数。如果一个整型数的长度与char *的长度不同,e x e c函数实际参数就将出错。
最后一个区别与向新程序传递环境表相关。以e结尾的两个函数( e x e c l e和e x e c v e)可以传递一个指向环境字符串指针数组的指针。其他四个函数则使用调用进程中的e n v i r o n变量为新程序复制现存的环境。通常,一个进程允许将其环境传播给其子进程,但有时也有这种情况,进程想要为子进程指定一个确定的环境。例如,在初始化一个新登录的s h e l l时, l o g i n程序创建一个只定义少数几个变量的特殊环境,而在我们登录时,可以通过s h e l l起动文件,将其他变量加到环境中。在使用ANSI C 原型之前, execle 的参数是:
char * p a t h n a m e, char *a rg 0, ⋯, char *a rg n, (char *)0, char * e n v p[ ]
从中可见,最后一个参数是指向环境字符串的各字符指针构成的数组的指针。而在ANSI C原型中,所有命令行参数,包括空指针, e n v p指针都用省略号(⋯)表示。
|
用exec函数调用,但不能调用执行脚本;
或者用system函数调用,都可以用。
或者用system函数调用,都可以用。
|
:)
4242
我一直都用system的
很好用的
system("/bin/ifconfig >a")
输出到文件a
4242
我一直都用system的
很好用的
system("/bin/ifconfig >a")
输出到文件a
|
exec并不是它一个是一个系列,呵呵
NAME
exec, execl, execv, execle, execve, execlp, execvp, - exe-
cute a file
SYNOPSIS
#include
int execl(const char *path, const char *arg0, ..., const
char *argn, char * /*NULL*/);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg0, ..., const
char *argn, char * /*NULL*/, char *const envp[]);
int execve(const char *path, char *const argv[], char *const
envp[]);
int execlp(const char *file, const char *arg0, ..., const
char *argn, char * /*NULL*/);
int execvp(const char *file, char *const argv[]);
水流
NAME
exec, execl, execv, execle, execve, execlp, execvp, - exe-
cute a file
SYNOPSIS
#include
int execl(const char *path, const char *arg0, ..., const
char *argn, char * /*NULL*/);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg0, ..., const
char *argn, char * /*NULL*/, char *const envp[]);
int execve(const char *path, char *const argv[], char *const
envp[]);
int execlp(const char *file, const char *arg0, ..., const
char *argn, char * /*NULL*/);
int execvp(const char *file, char *const argv[]);
水流