Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C和execve(3)参数_C_Exec_Constants_Ptrace_Execve - Fatal编程技术网

C和execve(3)参数

C和execve(3)参数,c,exec,constants,ptrace,execve,C,Exec,Constants,Ptrace,Execve,我正在做一个项目,基本上使用ptrace()做与strace(1)相同的事情。基本上,我们有一个controller.c程序,它将可执行文件作为参数,并输出可执行文件发出的任何系统调用(例如%controller ls-l) 我们正在使用execve()来运行可执行文件,但是我们遇到了一些问题。execve接受以下参数 execve( const char *filename, char *const argv[], char *const envp[] ) 其中,此实例中的文件名将是“ls

我正在做一个项目,基本上使用
ptrace()
做与
strace(1)
相同的事情。基本上,我们有一个controller.c程序,它将可执行文件作为参数,并输出可执行文件发出的任何系统调用(例如
%controller ls-l
) 我们正在使用
execve()
来运行可执行文件,但是我们遇到了一些问题。execve接受以下参数

 execve( const char *filename, char *const argv[], char *const envp[] )
其中,此实例中的文件名将是
“ls”
,而
argv[]
是给定文件名的参数列表。所以我们有这样的东西(在C文件中)

因此,如果我们得到一个可执行文件,例如
controller ls-l
其中argv[0]=“controller”
argv[1]=“ls”
argv[2]=“l”
,我们如何在“参数列表”中传递正确的参数(本例中的参数只是
“-l”
,但可能更多)

基本上,我们如何初始化
const char*
类型的数组,使数组具有可执行文件的参数值?我们甚至需要担心数组中有额外的值,而参数列表刚好超过
argv


谢谢你的帮助

您只需传递
argv+1
(跳过程序名)
argv+1
是指向数组的指针,该数组从
argv
的第二个元素开始,该元素是已执行程序的名称
argv+1
相当于
&argv[1]
,您可以使用您喜欢的任何样式

如评论中所述,本标准第5.1.2.2.1节规定,
argv
确实以空结尾。为完整起见,保留以下部分

如果C不能保证
argv
以null结尾(我不清楚它是否以null结尾),您可以执行以下操作:

char **new_argv = malloc((argc-1) * sizeof(char*));
for (int i = 0; i < argc - 1) new_argv[i] = argv[i+1];
char**new_argv=malloc((argc-1)*sizeof(char*);
对于(inti=0;i

并使用
new\u argv
作为参数列表。

我很少使用C。此语法是否适用于获取某个数组的子数组?(我要尝试一下)首先,你根本不需要内部的
if/else
,还有,为什么不把
&argv[1]
作为
execve
的中间参数呢?
argv+n
只是一个指向argv的
n
第个元素的数组/指针。它相当于
&argv[n]
。我想你会发现C实际上保证了argv和envp数组以null结尾。@Neil-你在什么地方找到证据了吗?我只是快速查看了一下规范,但我没有发现任何让我吃惊的地方。@CarlNorum:the Response to提到标准的5.1.2.2.1规定
argv
以null结尾,我一直认为这是正确的
envp
必须以NULL结尾,才能知道它的结尾。@AusCBloke,我现在正在看它,我看到了这行。我不知道我之前怎么会错过它——它正盯着我看:“
argv[argc]
应该是空指针。”
envp
并没有真正进入它,因为它不是标准的C。
execve(argv[1], argv+1, envp);
execve(argv[1], argv+1, envp);