기본적으로 strace(1)
과 동일한 작업을 수행중인 프로젝트에서 ptrace()
을 사용하고 있습니다. 기본적으로 우리는 실행 파일을 인수로 취하여 실행 파일로 만든 시스템 호출을 출력하는 controller.c 프로그램이 있습니다 (예 : % controller ls -l
) execve()
을 사용하여 실행 파일을 실행하지만 우리는 약간의 수고. 가 execve는 다음 인수 C 및 execve (3) 인수
execve(const char *filename, char *const argv[], char *const envp[])
이 경우 파일 이름이 "ls"
것
argv[]
는 주어진 파일 이름에 대한 인수의 목록입니다. 그래서 우리는 (은 C 파일)이 보이는 뭔가 우리가 예를
controller ls -l
,
where argv[0] = "controller"
,
argv[1] = "ls"
및
argv[2] = "-l"
를 들어, 실행 파일을 얻을 경우
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
}
}
그래서, 어떻게 우리가 "인수 목록에서 올바른 매개 변수를 전달할 수 있습니다 "(이 경우 인수는 단지 "-l"
이지만 더 많은 수 있습니다)?
기본적으로 배열에 const char *
유형의 배열을 초기화하여 해당 배열에 실행 파일의 인수 값이 포함되도록하려면 어떻게해야합니까? ARGUMENT LIST에 배열에 여분의 값을 넣고 걱정하지 않아도됩니까? argv
?
도움 주셔서 감사합니다.
C와는 많이 작동하지 않습니다. 이 구문은 일부 배열의 하위 배열을 가져 오는 작업을 수행합니까? (시도해 보겠다.) – user1348913
먼저, 'if/else' 내부와'execve'에 대한 중간 인수에 대해'& argv [1]'이 아닌 seond가 필요하지는 않습니까? –
'argv + n'은 단순히 argv의 n 번째 원소를 가리키는 배열/포인터입니다. 그것은'& argv [n]'과 동일합니다. – epsalon