fork execvp 예제

우리의 요구를 위해, 우리는 그 서명이 다음과 같이 보이는 execvp를 사용합니다 : 따라서 CD를 지원하기 위해 우리는 스스로 구현해야합니다. 또한 사용자가 입력한 명령이 cd(또는 미리 정의된 기본 제공 명령 목록에 속하는 경우)인 경우 프로세스를 전혀 포크하지 않도록 해야 합니다. 대신 cd(또는 다른 기본 제공)의 구현을 실행하고 다음 사용자 입력을 기다립니다. CD의 경우, 다행히 우리는 우리에게 사용할 수있는 chdir 함수 호출을 가지고 있으며 그것을 사용하는 것은 간단합니다. 경로는 인수로 받아들이고 성공 시 0을 반환하고 실패할 경우 -1을 반환합니다. 함수를 정의합니다: 업데이트: Saul은 <0의 오류를 확인하는 것이 일반적으로 == -1보다 낫다고 언급했습니다. 그에 따라 게시물과 코드 예제를 업데이트했습니다. 후자의 세 가지는 마지막 항목이 NULL인 문자열에 대한 포인터 배열을 사용하여 인수가 전달되는 형식 execv입니다. 예를 들어 C에서 execvp() 함수를 사용하는 방법을 보여 줄 수 있는 작은 예제를 볼 수 있습니다. 우리는 두 가지를해야합니다. C 파일 , EXEC.c 및 execDemo.c 우리는 execDemo.c에서 execvp() 함수를 호출하여 execDemo.c로 execDemo.c를 대체합니다.

파일 execDemo.c가 컴파일될 때, 문 execvp (args[0],args)가 실행되는 즉시,이 프로그램은 프로그램 EXEC.c로 대체됩니다. execvp() 함수가 호출되는 즉시 이 프로그램이 프로그램 EXEC.c로 대체되므로 « 종료–« 는 인쇄되지 않습니다. 포크 명령이 완료되면 자식은 상위 프로세스의 정확한 복사본입니다. 그러나 execvp를 호출하면 현재 프로그램이 인수에서 전달된 프로그램으로 바꿉습니다. 즉, 프로세스의 현재 텍스트, 데이터, 힙 및 스택 세그먼트가 대체되지만 프로세스 ID는 변경되지 않지만 프로그램이 완전히 덮어씁니다. 호출이 성공하면 execvp는 반환되지 않으며 이 이후의 자식의 코드는 실행되지 않습니다. 그리고 여기에 주요 함수가 있습니다 : 처음 세 가지는 양식 execl에 속하며 가변 인수 수를 수락합니다. 이 기능을 사용하려면 헤더 파일을 로드해야 합니다. stdarg.c 예제를 참조하십시오. 파트 에서 우리는 포크 시스템 호출과 그 주의 사항에 대해 논의했다.

이 게시물에서는 명령을 실행하는 방법을 살펴보겠습니다. 우리가 클래스에서 이미 보았듯이, fork() 명령은 실행 중인 프로세스의 전체 복사본을 만들고 두 가지를 구별하는 유일한 방법은 반환 된 값을 보는 것입니다 : 이제 명령을 실행할 수 있으므로 fork system cal을 사용하여 유용한 무언가를 구성해야합니다. L 우리는 부분 I에 대해 배웠습니다.