Я работаю над проектом, который в основном делает то же самое, что и strace(1)
, используя ptrace()
. В основном у нас есть программа controller.c, которая принимает исполняемый файл в качестве аргумента и выводит любые системные вызовы, сделанные исполняемым файлом (например, % controller ls -l
). Мы используем execve()
для запуска исполняемого файла, но у нас есть небольшие проблемы . execve принимает следующие аргументы
execve( const char *filename, char *const argv[], char *const envp[] )
где filename в этом случае будет "ls"
, а argv[]
- это список аргументов для данного имени файла. Итак, у нас есть что-то похожее на это (в файле C)
int main(int argc, char *argv[],char *envp[]){
pid_t child;
child = fork;
if(/* CHILD */){
ptrace(PTRACE_TRACEME,0, NULL, NULL);
if(argc == 2) {
execve(argv[1],NULL,envp);
}
else {
execve( argv[1], /* ARGUMENT LIST */, envp);
}
} else /* PARENT */ {
//PARENT CODE
}
}
Итак, если мы получим исполняемый файл, например controller ls -l
, where argv[0] = "controller"
, argv[1] = "ls"
и argv[2] = "-l"
, как мы можем передать правильный параметр в «СПИСОК АРГУМЕНТОВ» (где аргументы в этом случае просто "-l"
, но их может быть больше)?
В принципе, как нам инициализировать массив типа const char *
, чтобы в массиве были значения аргументов для исполняемого файла? Нужно ли нам вообще беспокоиться о наличии дополнительных значений в массиве и только после argv
для СПИСОК АРГУМЕНТОВ?
Спасибо за вашу помощь!
if/else
, и во-вторых, почему бы просто не&argv[1]
в качестве среднего аргумента дляexecve
? - person Carl Norum   schedule 17.09.2012argv + n
- это просто массив / указатель, который указывает наn
-й элемент argv. Это эквивалент&argv[n]
. - person epsalon   schedule 17.09.2012