首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我的execve()只有在参数包含/bin/时才有效?

execve()是一个系统调用函数,用于在Linux系统中执行一个新的程序。它的原型如下:

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

其中,filename参数是要执行的程序的路径,argv参数是一个字符串数组,包含了要传递给新程序的命令行参数,envp参数是一个字符串数组,包含了新程序的环境变量。

根据你的描述,你的execve()函数只在参数包含"/bin/"时才有效。这是因为在Linux系统中,"/bin/"目录下存放了许多系统命令和可执行文件。当你在execve()函数中指定的路径不包含"/bin/"时,系统无法找到要执行的程序,因此execve()函数调用失败。

举个例子,如果你想执行一个名为"myprogram"的程序,而该程序位于"/home/user/myprogram"目录下,你可以这样调用execve()函数:

代码语言:txt
复制
char *args[] = {"myprogram", NULL};
char *env[] = {NULL};
execve("/home/user/myprogram", args, env);

在这个例子中,execve()函数会执行"/home/user/myprogram"路径下的"myprogram"程序。

需要注意的是,execve()函数的参数是一个字符串数组,最后一个元素必须为NULL,以表示参数列表的结束。

至于腾讯云的相关产品和产品介绍链接地址,由于要求不能提及具体的云计算品牌商,我无法给出相关链接。但你可以通过访问腾讯云官方网站,查找他们的云计算产品和相关文档。

相关搜索:我不明白为什么"start-job“只有在我输入”接收-job“时才开始。为什么我的firebase聊天只有在我退出屏幕或关闭聊天并重新打开时才显示消息?为什么我的GTK CSS按钮颜色只有在我的应用程序未被选中时才起作用?当我包含参数时,为什么我的抓取不会完成?为什么我的计时器只在达到1时才更新为什么我的会话在包含刷新令牌时为空?我希望UITableViewCell中的UItextField只有在单元格触摸时才成为第一响应者我的游戏角色只有当鼠标在屏幕上移动时才移动,而它需要鼠标为什么我的函数只有在只使用三元运算符而不是常规的if/else语句时才起作用?为什么我的C# Xml代码只有在枚举变量enumerable时才能工作为什么我的clear按钮只在验证为真时才清除文本框?我希望只有在模板的输入中存在变量名时才执行request.POST[变量名我的代码只有在输入低于31时才有效[ProjectEuler100]问题#10-素数求和为什么我的程序在运行时没有在函数的括号中包含参数?为什么我的查询参数在使用useRouter时不存在?nextjs为什么带pool.query的POST请求只有在URL中间使用:id时才间歇性地起作用?css样式表只有在我使用外部CSS而不是一般的<style>时才有效。为什么我在将commad line image文件中的参数集作为参数传递时出现错误为什么我的正则表达式在RegexPal中有效,但在我运行Javascript时却没有?为什么我的函数使用原始列表,而不是我在调用该函数时用于参数的副本?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • [Linux][seccomp]seccomp引起的SIGSYS问题 ​

    前言 作者习惯使用Libvrit,多数情况下,会直接使用libvirt进行虚拟机操作。 如果要用qemu启动的情况,一般会比较习惯ps -ef | grep qemu得到qemu的启动参数,进行修改,然后启动。 在一次启动中,qemu发生了错误:qemu-system-x86_64: network script /etc/qemu-ifup failed with status 159 问题的原因是因为seccomp的配置导致的,那么我们就来看一下这个问题的具体表现。 分析 实例代码 构造一段实例代码,在父进程中初始化了seccomp,禁用了execve这个syscall,在子进程中尝试调用execve运行其他的程序。 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <seccomp.h> char *cmd = "/bin/ls"; int main() { int pid, status, ret; char *args[4]; char **parg; scmp_filter_ctx ctx; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) { printf("seccomp_init fail\n"); return 0; } ret = seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(execve), 0); if (ret < 0) { printf("seccomp_rule_add fail\n"); return 0; } ret = seccomp_load(ctx); if (ret < 0) { printf("seccomp_load fail\n"); return 0; } seccomp_release(ctx); pid = fork(); if (pid == 0) { parg = args; *parg++ = cmd; *parg++ = "-al"; *parg++ = "/proc/self/fd"; *parg = NULL; execv(cmd, args); } else { while (waitpid(pid, &status, 0) != pid); printf("status %d\n", status); } return 0; } 需要先安装libseccomp-dev(apt-get install libseccomp-dev),编译的时候: gcc execv.c -g -o execv -lseccomp 运行可以发现,子进程并不是正常退出的。 打开coredump 调整/proc/sys/kernel/core_pattern,配置coredump文件生成的规则。 ulimit -c unlimited调整但前shell的coredump文件大小限制,在当前的shell下运行,文件大小生效。

    01
    领券