很有趣,你这么说:
关键是我需要除了 argv 的第一个参数以外的所有参数。所以我不能只是把它发送到其他进程中,因为我实际上正在将其用作 execv 的参数
这听起来很像我正在做的事情,我想设置 LD_LIBRARY_PATH 然后使用我的自己的 ld.so 运行二进制文件,以便根本不使用默认系统共享库。execve 的参数是我的 ld.so 副本,但一旦真正的二进制文件开始运行,我希望它的 argv 看起来很正常(和环境变量)。以下是我在 Linux 上的实现方式:
include <stdlib.h>
#include <stdio.h>
#define PYBINARY "/data1/packages/python272/bin/python"
#define LDSO "/data1/packages/python272/lib/ld-linux-x86-64.so.2"
#define MYLIBS "/data1/packages/python272/lib"
extern char **environ;
main(int argc, char **argv, char **envp)
{
int retcode;
char **e;
char **myargv;
setenv("LD_LIBRARY_PATH",MYLIBS,1);
setenv("_",PYBINARY,1);
int i = 0;
myargv = (char **)malloc(sizeof(char *) * 100);
for(;argv[i] != NULL; i++) {
myargv[i+1] = (char *)malloc(sizeof(char) * (strlen(argv[i]) + 1));
memcpy(myargv[i+1], argv[i], strlen(argv[i]));
}
myargv[i+1] = NULL;
myargv[0] = LDSO;
myargv[1] = PYBINARY;
e = myargv;
while (*e != NULL){
printf("arg: %s\n",*e++);
}
retcode = execve(LDSO, myargv, environ);
perror("exec2: execve() failed");
exit(1);
}
如果您将以下内容放入test.py文件中:
import sys
print sys.argv
import os
print os.environ["_"]
使用 python -i test.py
运行它,您将获得与 ./mypy -i test.py
相同的结果,因此任何依赖于 argv 或 envp 的内容都不会出现问题。
scavenger USER=2.00 BUSY= 50.00 IDLE=30.00 ls -l
。所以我需要删掉4个命令。但如果原理相同,我可以只传递argv+4吗? - Blackbinary