execl fork 예제

popen() 호출은 파이프를 만들고, 포킹하고, 셸(Linux에서 본 셸)을 호출하여 프로세스를 엽니다. popen()을 사용하면 명령의 결과를 심문할 수 있다는 장점이 있습니다. 마지막으로 이름이 e에 의해 추가되는 경우 환경 변수를 나타내는 문자열 배열, 각 양식 “ENVVAR=value”와 null이 종료되는 배열을 포함할 수 있습니다. 예를 들어 다음 프로그램은 포크와 임원을 모두 사용합니다. 함수는 포크이고 자식 프로세스인 경우 인수 “”를 가진 find 명령을 시작합니다. 프로세스가 execve 시스템 호출을 하면 어떻게 됩니까? 코드 및 데이터 세그먼트는 파일 이름으로 식별된 파일에 포함된 프로그램에 의해 초기화됩니다. 주목해야 할 가장 중요한 점은 동일한 프로세스 (pid는 이전과 동일함)이지만 새 프로그램을 실행하는 것입니다. 덧붙여, execve는 프로그램과 프로세스의 차이를 충분히 강조할 수 없는 한 가지 예입니다. 프로세스는 일부 작업을 수행 하도록 작성 된 프로그램을 실행 하기 위해 커널에 의해 만들어진 엔터티입니다. argv는 배열의 0th 요소가 프로그램 자체의 파일 이름인 프로그램에 대한 인수 배열입니다. envp는 형식, 이름 = 값의 환경 변수 배열입니다. argv 및 envp의 마지막 요소는 NULL이어야 합니다. argv와 envp 는 프로그램의 주요 함수에 액세스할 수 있으며, 루틴 execlp()는 환경 변수 PATH를 사용하여 처리할 실행 방법을 결정하는 것을 제외하고는 동일한 목적을 수행합니다.

따라서 정규화된 경로 이름을 사용할 필요가 없습니다. 함수에 대한 첫 번째 인수는 대신 “ls”일 수 있습니다. 함수 execlp()는 명시적으로 해결될 때 정규화된 이름을 사용할 수도 있습니다. 가장 큰 차이점은 포크의 경우 부모 프로세스의 복제인 새 자식 프로세스가 생성된다는 것입니다. 프로세스가 exec을 실행하면 새 프로세스가 만들어지지 않습니다. 호출 프로세스는 파일 이름이 첫 번째 인수로 전달되는 프로그램에 의해 덮어씁니다. 대부분의 경우 프로세스는 포크를 호출하여 새 자식 프로세스를 만듭니다. 그런 다음 자식 프로세스는 실행될 프로그램입니다.

그래서, 포크와 임원은 주로 함께 사용됩니다. 포크가 없으면 임원은 제한된 사용입니다. 그리고, 임원없이, 포크는 거의 어떤 사용이 아니다. 참고:- vfork에서 신호 처리기는 상속되지만 공유되지는 않습니다. 후자의 세 가지는 마지막 항목이 NULL인 문자열에 대한 포인터 배열을 사용하여 인수가 전달되는 형식 execv입니다. 예를 들어 system() 호출이 character 명령 문자열에 설명된 대로 OS 셸 명령을 실행해야 할 수 있습니다. 이 함수는 fork(), exec() 및 waitpid()를 사용하여 구현됩니다. 명령 문자열은 /bin/sh-c 명령 문자열을 호출하여 실행됩니다. 명령을 실행하는 동안 SIGCHLD가 차단되고 SIGINT 및 SIGQUIT가 무시됩니다.

호출은 “차단”하고 계속하기 전에 작업이 수행될 때까지 기다립니다. 인수가 char에 대한 포인터의 null 종료 배열로 전달된다는 점을 제외하면 execl()과 동일합니다.