如何在linux中使用execv系统调用?

时间:2015-08-21 13:55:56

标签: c linux unix exec

我正在使用execl编写一个程序来执行我正在测试的exe文件,它的工作非常好,并在Linux CLI中显示输出。但我不知道如何将execl更改为execv,虽然我知道两个系统调用都会给出相同的值。我对execv系统调用的数组参数感到困惑

这是我的execl示例程序

int main(void)
{
   int childpid;
   if((childpid = fork()) == -1 )
{
   perror("can't fork");
   exit(1);
}
 else if(childpid == 0)
{
  execl("./testing","","",(char *)0);
  exit(0);
}
else
{
printf("finish");
exit(0);
}
}

我可以知道如何将execl更改为execv。我从网上读到的,我们必须设置我的exe文件的文件路径和数组的参数。为了要求程序执行测试exe文件,需要为数组设置什么类型的参数? https://support.sas.com/documentation/onlinedoc/sasc/doc/lr2/execv.htm

链接是否包含我想要的内容?但是我从中读到的是,命令是请求列表文件,而不是执行文件。纠正我,我犯了任何错误

2 个答案:

答案 0 :(得分:15)

为了看到execl和execv之间的区别,这里有一行执行

的代码

ls -l -R -a

与execl:

execl("/bin/ls", "ls", "-l", "-R", "-a", NULL);

与execv:

char* arr[] = {"ls", "-l", "-R", "-a", NULL};
execv("/bin/ls", arr);

发送到execv的char *数组将作为argv传递给/ bin / ls(在int main(int argc, char **argv)中)

以下是execl(3) Linux manual page的详细信息。

答案 1 :(得分:8)

根据手册页,使用execv非常简单。第一个参数是作为要执行的程序的字符串的路径。第二个是一个字符串数组,它将用作您要执行的程序的参数。如果你在main函数中得到argv数组,那就是你得到的那种数组。

因此,您将作为参数传递的数组将是您使用execv执行的程序的主函数中接收的数组。

按照惯例,第一个参数应该是程序名称(您尝试执行的名称),但它不是强制性的(但强烈建议,因为它是很多程序所期望的行为)。数组中的每个其他字符串都应该是一个单独的参数。

当然,应该使用NULL指针终止数组以标记结束。

数组示例:["prog_name", "arg1", "arg2", "arg3", NULL]

[]是你的数组,用逗号分隔的每个字符串都是数组的一个框架,最后你有空框架。

我希望我足够清楚!