fork execl 예제

프로세스가 execve 시스템 호출을 하면 어떻게 됩니까? 코드 및 데이터 세그먼트는 파일 이름으로 식별된 파일에 포함된 프로그램에 의해 초기화됩니다. 주목해야 할 가장 중요한 점은 동일한 프로세스 (pid는 이전과 동일함)이지만 새 프로그램을 실행하는 것입니다. 덧붙여, execve는 프로그램과 프로세스의 차이를 충분히 강조할 수 없는 한 가지 예입니다. 프로세스는 일부 작업을 수행 하도록 작성 된 프로그램을 실행 하기 위해 커널에 의해 만들어진 엔터티입니다. argv는 배열의 0th 요소가 프로그램 자체의 파일 이름인 프로그램에 대한 인수 배열입니다. envp는 형식, 이름 = 값의 환경 변수 배열입니다. argv 및 envp의 마지막 요소는 NULL이어야 합니다. argv와 envp 는 프로그램의 주요 함수에서 액세스 할 수 있으며, 각 프로세스는 자식에게 복사 된 환경 변수의 자체 사전을 가져옵니다. 즉, 부모가 환경 변수를 변경하면 자식으로 전송되지 않으며 그 반대의 경우도 마찬가지입니다. 이것은 부모 (또는 다른 프로세스)와 다른 환경 변수가있는 프로그램을 exec하려는 경우 fork-exec-wait 부작에서 중요합니다. 부모의 복사본인 프로세스를 갖는 용도는 무엇입니까? 많지 않음.

그러나, 다음, 포크 시스템 호출은 주로 exec의 변화와 함께 사용된다. 리눅스에서는 execve 시스템 호출이 있으며 execve 시스템 호출의 프런트 엔드인 이름으로 시작하는 6 가지 기능이 있습니다. Linux의 맥락에서 exece라고 말할 때 execve 시스템 호출 또는 이 자습서의 후반부에서 설명하는 6가지 함수 중 하나를 의미합니다. 환경, 리소스 제한, umask, 제어 터미널, 현재 작업 디렉토리, 루트 디렉터리, 신호 마스크 및 기타 프로세스 리소스도 포크된 자식 프로세스의 부모로부터 복제됩니다. 클래스에서 이미 보았듯이 fork() 명령은 실행 중인 프로세스의 전체 복사본을 만들고 두 명령을 구별하는 유일한 방법은 반환된 값을 보는 것입니다. 이 기능을 사용하려면 헤더 파일을 로드해야 합니다. stdarg.c 예제를 참조하십시오. 위의 예는 그러나 몇 가지 미묘한 포인트를 놓친다: popen () 호출 파이프를 만들고, 포크, 쉘 (리눅스에서 본 쉘)을 호출 하 여 프로세스를 엽니다.

popen()을 사용하면 명령의 결과를 심문할 수 있다는 장점이 있습니다. 마지막으로 이름이 e에 의해 추가되는 경우 환경 변수를 나타내는 문자열 배열, 각 양식 „ENVVAR=value“와 null이 종료되는 배열을 포함할 수 있습니다. 예를 들어, 추측할 수 있듯이 fork.c의 소스 코드가 실행된 시점과 getpid.c가 실행된 시간 사이에 운영 체제에서 약 1000개의 프로세스가 만들어졌습니다. 프로세스 ID가 다릅니다. getppid() 호출자에서 (두 `p`s)는 부모에서 getpid()를 호출하는 것과 동일한 결과를 제공합니다. 자세한 내용은 포크 맨 페이지를 참조하십시오. 예를 들어 모든 표준 시간대를 반복하고 날짜 명령을 실행하여 모든 지역 구에서 날짜와 시간을 인쇄하는 C 프로그램을 작성할 수 있습니다. 환경 변수는 모든 종류의 프로그램에 사용되므로 수정하는 것이 중요합니다. 루틴 execlp()는 환경 변수 PATH를 사용하여 처리할 실행 방법을 결정하는 것을 제외하고는 동일한 목적을 수행합니다.

따라서 정규화된 경로 이름을 사용할 필요가 없습니다. 함수에 대한 첫 번째 인수는 대신 „ls“일 수 있습니다. 함수 execlp()는 명시적으로 해결될 때 정규화된 이름을 사용할 수도 있습니다.

프로세스가 execve 시스템 호출을 하면 어떻게 됩니까? 코드 및 데이터 세그먼트는 파일 이름으로 식별된 파일에 포함된 프로그램에 의해 초기화됩니다. 주목해야 할 가장 중요한 점은 동일한 프로세스 (pid는 이전과 동일함)이지만 새 프로그램을 실행하는 것입니다. 덧붙여, execve는 프로그램과 프로세스의 차이를 충분히 강조할 수 없는 한 가지 예입니다. 프로세스는 일부 작업을 수행 하도록 작성 된 프로그램을 실행 하기 […] , 2019