리눅스 fork exec 예제

나는 리눅스 민트 19 XFCE의 가상 단말기에서 첫 번째 예제를 시도하고 오류를 생성 : 참고 :- 앞에서 설명한 바와 같이, 여러 번 vfork 시스템 호출의 동작은 예측 할 수 없습니다. 위의 경우와 마찬가지로 한 번 및 두 번 전에 인쇄했지만 _exit() 함수로 호출을 중단했습니다. 그렇지 않으면 포크 시스템 호출을 사용하고 가능한 한 vfork를 사용하지 않는 것이 좋습니다. 자녀는 부모의 PID를 알아야 하는 경우 저장된 값 부모를 사용할 수 있습니다(이 예제에서는 그렇지 않지만). 부모는 자녀가 끝날 때까지 기다립니다. 효과적으로 자식은 부모 내부에서 “동기적으로” 실행되며 병렬 처리가 없습니다. 부모는 상태를 쿼리하여 자식이 종료한 방식(성공적으로, 실패하거나 신호)을 확인할 수 있습니다. 포크 시스템 호출에 사용되는 구문은 아래와 같습니다. 함수는 포크이고 자식 프로세스인 경우 인수 “”를 가진 find 명령을 시작합니다. 위의 함수 중 처음 5개 함수의 이름은 형식 의 execXY입니다. X는 인수가 목록 형식(arg0, arg1, …, NULL)으로 제공되는지 여부에 따라 l 또는 v이거나 인수가 배열(벡터)으로 전달됩니다. Y는 결석하거나 p 또는 e입니다.

Y가 p인 경우 PATH 환경 변수가 프로그램을 검색하는 데 사용됩니다. Y가 e이면 envp 배열에 전달된 환경이 사용됩니다. execvpe의 경우, X는 v이고 Y는 e이다. execvpe 함수는 GNU 확장입니다. execve 시스템 호출(execve (2)))과 구별되도록 명명됩니다. 이 예제는 셸 명령 “ls-l”을 실행하는 파이프를 엽니다. 결과를 읽고 인쇄합니다. 참고 : vfork의 결과를 관찰하면 다시 정의되지 않습니다.

“n”의 값은 예상되는 10으로 처음 인쇄되었습니다. 그러나 부모 프로세스에서 다음에 일부 가비지 값을 인쇄했습니다. exec() 가족은 다음과 같은 기능으로 구성되어 있으며, C 프로그램에서 execv()를 구현했으며, 운동 노트로 휴식을 시도 할 수 있습니다 : vfork는 때때로 복제의 특별한 경우라고도합니다. exec() 함수 제품군이 있는데, 모두 약간 다른 특성을 가지고 있습니다: exit() 및 _exit(에 참고): C 라이브러리 함수 exit() 내부적으로 커널 시스템 호출 _exit()를 호출합니다. 커널 시스템 호출 _exit()는 커널이 설명자, 사용 사용 대기 메모리를 닫고 커널 종료 프로세스 정리를 수행하게 합니다. C 라이브러리 함수 exit() 호출은 I/O 버퍼를 플러시하고 내부적으로 _exit()를 호출하기 전에 aditional 정리를 수행합니다. 함수 종료(status)는 실행 수에서 main()에 대한 반환 코드로 “status”를 반환합니다. 자식 프로세스에서 exit(status)를 호출하면 부모 프로세스가 자식의 종료 상태를 검사할 수 있습니다(먼저 종료되는 경우). 이 호출(또는 main(에서 return()으로 호출)을 호출하고 상태 인수를 지정하지 않으면 프로세스가 값을 반환하지 않습니다. 우리가 클래스에서 이미 보았듯이 fork() 명령은 실행 중인 프로세스의 전체 복사본을 만들고 두 명령을 구별하는 유일한 방법은 반환된 값을 보는 것입니다: 각 시스템 호출은 l 또는 v 다음에 exec이라는 단어입니다.

또는 p. 이 프로그램은 이 컴퓨터에서 컴파일되고 실행될 때 exec() 함수 또는 sys 호출 패밀리를 인쇄하여 현재 프로세스 이미지를 새 프로세스 이미지로 대체합니다. 자세한 내용은 온라인 텍스트 고급 Linux 프로그래밍의 3장을 참조하십시오. 우리는 부모와 자식 프로그램의 개념과 각 프로세스를 설명하기 위해 다소 간단한 예를 만들었습니다. 보다 현실적인 예는 셸입니다. 셸은 상위 프로세스입니다. 명령줄에서 각 입력 줄을 읽고 자식 셸 프로세스를 포크하여 차례로 exec의 명령입니다.

Por
agosto 2, 2019