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
'IT이야기' 카테고리의 다른 글
vue js를 사용하여 클릭한 요소의 경고 ID를 선택하십시오. (0) | 2022.04.28 |
---|---|
Java 힙 용어: 젊은 세대, 오래된 세대 및 영구 세대? (0) | 2022.04.28 |
공리 응답의 데이터 처리 (0) | 2022.04.27 |
0.1 float가 0.1 double보다 크다.나는 그것이 거짓이라고 기대했다. (0) | 2022.04.27 |
Vue 앱에서 자동 복구된 사용자의 데이터를 가져오는 최적의 장소? (0) | 2022.04.27 |