IT이야기

Linux에서 execlp()가 어떻게 작동하는지 이해할 수 없음

cyworld 2022. 4. 27. 21:40
반응형

Linux에서 execlp()가 어떻게 작동하는지 이해할 수 없음

나는 지난 이틀 동안 그 사실을 이해하려고 노력했다.execlp()시스템 호출, 하지만 난 여기 있어내가 그 문제를 바로 짚고 넘어가겠다.

man page시스템 호출을 다음과 같이 선언한다.int execlp(const char *file, const char *arg, ...);다음과 같은 설명과 함께:execl(), execlp(), execlp() 및 exle() 함수의 const char arg와 후속 타원은 arg0, arg1, ..., argn으로 생각할 수 있다.

그러나 나는 우리의 텍스트북에서 이렇게 불리는 시스템 콜을 본다.execlp(“/bin/sh”, ..., “ls -l /bin/??”, ...);(…."은 우리가 학생으로서 알아낼 수 있는 것이다.하지만 이 시스템 콜은 심지어 그 선언과 전혀 닮지 않았다.man page시스템 호출의.

나는 너무 혼란스럽다.어떤 도움이라도 감사하다.

이 프로토타입:

  int execlp(const char *file, const char *arg, ...);

execlp는 변수 인수 함수를 말한다.2가 걸린다.const char *. 나머지 논쟁은, 만일 있다면, 우리가 실행하고자 하는 프로그램에 넘겨줄 추가적인 논쟁이다. 또한char *- 모두 C 문자열(마지막 인수는 NULL 포인터여야 함)

그래서, 그.file인수는 실행할 실행 파일의 경로 이름이다. arg우리가 원하는 문자열은argv[0]실행 가능한관례상argv[0]실행 파일의 이름일 뿐이며, 일반적으로 실행 파일의 이름은file.

...이제 실행 파일에 부여할 추가 인수인계.

명령줄/셸에서 이 작업을 실행한다고 가정하십시오.

$ ls

그럴 것이다.execlp("ls", "ls", (char *)NULL);아니면 달리면

$ ls -l /

그럴 것이다.execlp("ls", "ls", "-l", "/", (char *)NULL);

에게 계속.execlp("/bin/sh", ..., "ls -l /bin/??", ...);

/bin/sh , 조개껍데기로 가서 조개껍데기에게 실행 명령을 내린다.그 명령은 "ls -l /bin/??"?" 명령행/셸에서 수동으로 실행할 수 있는 기능:

 $ ls -l /bin/??

자, 조개껍데기를 어떻게 실행해서 명령을 실행하라고 말하는가?당신은 당신의 껍데기에 대한 문서/맨 페이지를 열고 그것을 읽는다.

실행하고자 하는 내용은 다음과 같다.

$ /bin/sh -c "ls -l /bin/??"

이 되다

  execlp("/bin/sh","/bin/sh", "-c", "ls -l /bin/??", (char *)NULL);

시드노테:/bin/??패턴 매칭을 하고 있으며, 이 패턴 매칭은 셸에 의해 이루어지며, 2개의 문자로 /bin/ 아래의 모든 파일로 확장된다.만약 당신이 단순히 했다면

  execlp("ls","ls", "-l", "/bin/??", (char *)NULL);

아마도 아무 일도 일어나지 않을 것이다(실제로 이름이 붙여진 파일이 없는 한)./bin/??) /bin/?을 해석하고 확장하는 껍데기가 없기 때문에.

execl의 한계는 셸 명령어나 현재 작업 디렉토리에 없는 다른 스크립트를 실행할 때 명령어 또는 스크립트의 전체 경로를 통과해야 한다는 것이다.예:

execl("/bin/ls", "ls", "-la", NULL);

실행 파일의 전체 경로를 통과하기 위한 해결책은 PATH가 가리키는 디렉토리에서 파일(execlp의 첫 번째 인수)을 검색하는 execlp 함수를 사용하는 것이다.

execlp("ls", "ls", "-la", NULL);

참조URL: https://stackoverflow.com/questions/21558937/i-do-not-understand-how-execlp-works-in-linux

반응형