首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用execve (linux)

使用execve (linux)
EN

Stack Overflow用户
提问于 2022-06-06 05:08:15
回答 4查看 110关注 0票数 0

我对系统调用execve的使用感到困惑。第二个参数应该是指向参数的指针,但是它不能工作,但是当我将整个命令(/bin/bash)+ arg作为第二个参数发送时,它确实正确地执行。

./test /bin/bash "echo 'this is a test' | wc -c"

代码语言:javascript
复制
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int main(int argc, char *argv[]) {
    execve(argv[1], &argv[1], NULL); ////works, but I dont understand how since the 2nd param is wrong.
    return 0;
}

int main(int argc, char *argv[]) {
    execve(argv[1], &argv[2], NULL);  ////doenst work, it should since Im sending the correct aguments.
    printf("hi");
    return 0;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-06-06 05:49:37

来自execve(2) man page

argv是一个指向作为命令行参数传递给新程序的字符串的指针数组。按照惯例,这些字符串中的第一个字符串(即argv[0]**) )应该包含与正在执行的文件相关联的文件名**。argv数组必须由NULL指针终止。(因此,在新程序中,argv[argc]将是NULL。)

换句话说,在第二个参数中传递的参数列表包括可执行文件本身的名称(尽管在第一个参数中已经指定了它)。这就是可执行文件如何检测它们是如何被调用的(例如通过符号链接),并在它们的“帮助”输出中显示正确的名称。

票数 1
EN

Stack Overflow用户

发布于 2022-06-06 06:02:49

argv[0]包含正在执行的文件的名称。因此,execve还需要将文件作为第一个元素执行(索引0)。

票数 2
EN

Stack Overflow用户

发布于 2022-06-06 05:50:00

在“执行者”中我们可以看到它的原型是:

代码语言:javascript
复制
 int execve(const char *pathname, char *const argv[], char *const envp[]);

根据execve man (https://man7.org/linux/man-pages/man2/execve.2.html)

argv是一个指向作为命令行参数传递给新程序的字符串的指针数组。按照惯例,这些字符串中的第一个(即argv) 应该包含与正在执行的文件相关联的文件名。argv数组必须由空指针终止。(因此,在新程序中,argvargc将为空。)

关于这些规则,您的代码应该是:

代码语言:javascript
复制
#include <stdio.h>
#include <unistd.h>

int main ()
{

    char *filepath = "/bin/echo";
    char *argv[] = { filepath, "Hello World", NULL };

    execve (filepath, argv, NULL);
  
  return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72513285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档