리눅스 execve 예제

전체 호출은 execve (경로, argv, env)입니다. 두 번째 인수는 프로세스의 인수 배열(./sub 프로그램의 주 인수에 대한 두 번째 인수에서 볼 수 있는 argv)를 제공합니다. 세 번째 인수는 프로세스의 환경(./sub 프로그램에서 볼 수 있는 환경)을 제공합니다. setenv() 및 putenv() 환경 수정, 그래서 당신은 execve (를 통해 전달 하면, 환경 변수는 당신이 예상 하는 것 처럼 될 것입니다. execve는 새 프로세스를 만들지 않습니다! 그렇다면 어떻게 한 프로세스에서 두 프로세스로 얻을 수 있을까요? 대답은 포크입니다 – 다른 시스템 호출, 미래의 게시물에 적용 할 수 있습니다. 또한 첫 번째 요소는 아무런 결과 없이 값을 할당할 때 아무런 영향을 미치지 않습니다. 이 예제에서는 „hello”는 아무 것도 하지 않습니다. 이 예제에서는 argv 및 envp 값이 의도적으로 이상합니다. 프로그램의 이름을 첫 번째 인수로 전달하는 것은 관용적이지만,이 경우이 관용구가 깨질 수 있습니다 : 프로그램은 „./sub”이지만 첫 번째 인수 „jim”을 전달합니다.

따라서 하위 프로그램은 „./sub”에서 프로그램에서 실행되었다는 것을 알지 못합니다. envp는 „FOO=bar”와 같은 환경에서 키 값 문자열을 전달하는 것이 관용적이기 때문에 이상합니다. 다시 말하지만, 이것은 단지 숙어일 뿐이며 깨질 수 있습니다. 작업 디렉토리를 변경하기 위해 수행 한 것은 execve (..) 앞에 chdir (.)를 넣고 호출하는 것이었습니다 : 쉘은 execve () 호출에서 명시적으로 설정한 환경 변수 SHLVL, _ 및 PWD를 추가했습니다. 이 예제에서 프로그램은 -c 및 env 인수로 /bin/sh를 실행하므로 셸이 현재 PATH에 있는 env 프로그램을 실행합니다. 여기서 환경은 정통 형식으로 5개의 값을 포함하도록 설정되어 있습니다. 예를 들어 env를 날짜(또는 env; 날짜)로 변경하면 TZ 설정의 효과가 표시됩니다. MacOS X 컴퓨터에서 실행하면 출력이 다음과 됩니다. execve() 시스템 호출 함수를 사용하는 것도 다음과 같다.

다음 예제는 execl() 사용과 유사합니다. 또한 env 인수를 사용하여 새 프로세스 이미지에 대한 환경을 지정합니다. int execve(const char *파일 이름, char *const argv[], char *const envp[]); execve()는 파일 이름으로 가리키는 프로그램을 실행합니다. 파일 이름은 이진 실행 파일이거나 양식 „#의 줄로 시작하는 스크립트여야 합니다. 통역사 [arg]”. 후자의 경우 인터프리터는 실행 파일 자체가 아닌 실행 파일의 유효한 경로 이름이어야 하며 인터프리터 [arg] 파일 이름으로 호출됩니다. execve 시스템 호출은 UNIX에서 새로운 프로세스가 생성되는 방식의 일부입니다. execve 호출은 현재 프로세스 이미지를 새 프로세스 이미지로 바꿉니다.

실시예: 외향적 char **environ; int execl (const char *path, const char *arg0, … /*, (char *)0 */; int execv (const char *path, char *const argv[]); int execle (const char *path, const char *arg0, … /*, (char *)0, char *const envp[***/); int execve(const char *path, char *const argv[], char *const envp[]; int execlp (const char *파일, const char *arg0, …