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

10

我正在编写一个程序,使用execl来执行我的可执行文件进行测试,并且在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
你为什么想要使用 execv?你实际上想要完成什么任务? - Kevin
1
你尝试过链接页面上的示例吗?这里是官方Linux man页:http://man7.org/linux/man-pages/man3/exec.3.html - alk
http://linux.die.net/man/3/execv -- 区别在于 execv 需要一个指向 char * 数组的单一指针,而 execl 接受可变参数列表的 char * - tripleee
相关问题,如果不是重复的话:https://dev59.com/umTWa4cB1Zd3GeqPCVcs - alk
1
就像Kevin所说,为什么要改变它呢?除了execvpe之外,据我所知,它基本上是“真正”的execve的别名,其余都只是语法糖。因此,请使用已经可用的那个。 - Brian McFarland
因为我看到execv对我来说会带来相同的结果,所以我只想尝试一下。 - doe
2个回答

29

为了看到区别,这里有一行代码执行 ls -l -R -a

execl("/bin/ls", "ls", "-l", "-R", "-a", NULL);
  • 使用 execv(3) 函数:

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

    将发送到execvchar(*)[]作为argv传递给/bin/ls(在int main(int argc, char **argv)中)


    C语言是否支持内联数组,例如execv("/bin/ls", ["ls", "-l", "-R", "-a", NULL]);?在Linux机器上使用gcc --std=c99 file.c编译时,我收到了一个错误:error: expected expression before '[' token。在其他地方找不到任何关于此的信息...有什么想法吗? - sleighty
    1
    不好意思,那只是为了解释区别。我会编辑的。 - 4rzael
    哦,谢谢哈哈,我一直在疯狂地寻找让它工作的方法。 - sleighty
    我知道这很老旧,但是 char* arr[] = {"ls", "-l", "-R", "-a", NULL}; execv("/bin/ls", arr); 不应该变成 char* arr[] = {"ls", "-l", "-R", "-a", NULL}; execv("/bin/", arr); 吗? - vpappano

    9
    根据 man 页面,使用 execv 相当简单。第一个参数是作为字符串传递的要执行程序的路径。第二个参数是一个字符串数组,将用作要执行程序的参数。如果在主函数中获取 argv 数组,则可以获得此类数组。
    因此,您将作为参数传递的数组将是使用 execv 执行的程序的主函数中接收到的数组。
    按照惯例,第一个参数应该是程序名称(您尝试执行的程序),但这不是强制性的(但强烈建议,因为许多程序都期望这种行为)。数组中的每个其他字符串应该是一个单独的参数。
    当然,该数组应以 NULL 指针结尾以标记其结束。
    数组示例:["prog_name", "arg1", "arg2", "arg3", NULL]
    [] 是您的数组,每个用逗号分隔的字符串都是数组的一帧,在最后您有 null 帧。
    希望我表述清晰!

    谢谢,你的指南对我非常有帮助。但是在数组中,我需要指定什么类型的参数?这与4rzael的答案类似吗? - doe
    是的,它们相似。你的数组是一个字符串(char *)数组。所以更像是 ["prog_name", "arg1", "arg2", "arg3", NULL] - Roger
    如果命令具有 arg1 val1 arg2 val2 的语法(例如 iptables -A INPUT -p udp),那么 valX 是否被视为参数? - ransh

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接