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

问题描述 投票:0回答:2

我正在使用 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 文件的文件路径和 array 的参数。需要为数组设置什么类型的参数才能要求程序执行测试 exe 文件? https://support.sas.com/documentation/onlinedoc/sasc/doc/lr2/execv.htm

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

c linux unix exec
2个回答
29
投票

为了看到差异,这里有一行代码执行

ls -l -R -a

  • execl(3)
    :

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

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

发送到

char(*)[]
execv
将被传递到
/bin/ls
作为
argv
(在
int main(int argc, char **argv)
中)


9
投票

根据手册页,

execv
的使用非常简单。第一个参数是要执行的程序的字符串路径。第二个是一个字符串数组,它将用作要执行的程序的参数。如果您在主函数中获取
argv
数组,就会得到这种数组。

因此,您将作为参数传递的数组将是您使用

execv
执行的程序的主函数中接收到的数组。

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

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

数组示例:

["prog_name", "arg1", "arg2", "arg3", "arg4", NULL]

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

我希望我说得足够清楚!

© www.soinside.com 2019 - 2024. All rights reserved.