Интересно, что вы должны сказать:
Главное, мне нужны все, кроме первого аргумента аргумента 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);
/* copy argv */
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, не сломается.