c - 为什么 execve 不启动进程?
问题描述
我为 uni 写了一个方法,它应该启动一个程序。我必须使用 execve。但它不起作用。例如,当我使用 execvp 而不是 execve 时,它可以工作并启动程序。
#include <stddef.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
pid_t run_command(char **argv, int no_fork){
extern char **environ;
pid_t pid;
if(no_fork != 0){
execve(*argv, argv, environ);
return 0;
}
else{
if((pid = fork()) < 0){
printf("Error: fork!\n");
return -1;
}
else if(pid == 0){
argv++;
printf("execve(%s)\n", *argv);
execve(*argv, argv, environ);
}
else {
wait(NULL);
}
}
return pid;
}
/*
int run_cmdline(char ** argv){
return 0;
}*/
int main(int argc, char* argv[]){
run_command(argv, 0);
return 0;
}
编译:
clang -o 主 shell.c
例如执行:
./主火狐
应该启动火狐。使用 execvp 和没有 environ 它可以工作,但不能使用 execve。
感谢任何帮助:)
解决方案
execve(*argv, argv, 环境);
./主火狐
execve
不搜索 PATH。您必须提供可执行文件的完整路径或自己解析路径。此行为的参考在posix中,但我觉得很难阅读,man execve对我来说看起来更容易。
所以像:
./main /usr/bin/firefox
应该工作,甚至:
./main /usr/bin/sh -c firefox
或者也许只是使用自动神奇地execvp
获取“父级”environ
并搜索路径。还有一个 linux 扩展execvpe
,它不在 posix 中并且确实需要environ
.
推荐阅读
- sql - 变量@@rowcount 的值
- informix - 小数之和只有16位吗
- c - Xlib:干净地关闭 X 服务器
- path - 在 google colab 中查找路径
- javascript - 图像网格,调整图像大小以适应屏幕上的整个图像网格,而无需滚动
- java - Hive,如何将自定义 java UDF 打包为 jar 文件?
- typescript - 如何判断 Typescript 中是否存在函数
- php - 有没有办法操纵 php artisan make:request 发出的请求的响应?
- amazon-dynamodb - 如何在 ASP.NET Core 中以编程方式获取 DynamoDb 中的实时表行数?
- r - 在 R 中使用需要多个参数的函数进行总结