2012-09-16 5 views
1

기본적으로 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?

도움 주셔서 감사합니다.

+0

C와는 많이 작동하지 않습니다. 이 구문은 일부 배열의 하위 배열을 가져 오는 작업을 수행합니까? (시도해 보겠다.) – user1348913

+0

먼저, 'if/else' 내부와'execve'에 대한 중간 인수에 대해'& argv [1]'이 아닌 seond가 필요하지는 않습니까? –

+0

'argv + n'은 단순히 argv의 n 번째 원소를 가리키는 배열/포인터입니다. 그것은'& argv [n]'과 동일합니다. – epsalon

답변

1

간단하게 argv + 1 (프로그램 이름을 건너 뛰기)을 전달할 수 있습니다. argv + 1은 실행 된 프로그램의 이름 인 argv의 두 번째 요소에서 시작하는 배열에 대한 포인터입니다. argv + 1&argv[1]과 같으며 선호하는 스타일을 사용할 수 있습니다.

주석에서 언급했듯이 argv이 실제로 null로 끝나는 표준 표준의 5.1.2.2.1 절에서 언급했듯이. 아래 섹션은 완전성을 위해 유지됩니다.

이 경우 C는 argv가 null 끝나는 보증하지 않습니다 (그리고 수행 여부 내게 분명하지 않다), 당신은 할 수 있습니다 :

char **new_argv = malloc((argc-1) * sizeof(char*)); 
for (int i = 0; i < argc - 1) new_argv[i] = argv[i+1]; 

및 인수 목록 new_argv를 사용합니다.

+0

이것이 효과가 있습니다! 도와 주셔서 감사합니다! – user1348913

+0

C가 실제로 argv와 envp 배열이 null로 끝나는 것을 보장한다는 것을 알게 될 것입니다. – Neil

+0

@Neil - 어딘가에서 그 증거를 찾았습니까? 방금 스펙을 간략하게 살펴 봤지만 나에게 뛰어든 것은 아무것도 없었다. –