포크 시스템 호출 코드는 어떻게 작성됩니까? 함수가 두 개의 다른 값을 반환 할 수있는 방법과 두 개의 다른 프로세스를 반환하는 방법에 대해 자세히 알고 싶습니다. 간단히 포크 시스템 호출이 어떻게 구현되는지 알고 싶습니까?포크 구현
포크 구현
답변
당신은 시스템 호출이라고 말하면서 설명했습니다. 운영 체제는 모든 작업을 수행하는 작업이며 운영 체제는 프로그램의 컨텍스트 외부에서 원하는 모든 작업을 수행하거나 구현할 언어의 규칙을 거의 수행 할 수 있습니다. 여기에 간단한 예제가 있습니다. 일 :
이- 프로그램 (
fork()
시스템 호출 - 커널 포크 시스템 콜이 프로그램 커널은 원래 프로그램과 중복에 대한 시스템 호출의 반환 값을 설정
- 를 실행하는 과정을 복제의 PID 호출 duplicate와 0, 각각)
- 커널은 두 프로세스를 스케줄러 큐
- 각 프로세스가 스케줄 될 때 커널은 두 프로그램 각각에 '리턴'합니다.가
return pid; return 0;
먼저 처리가 먼저 실행된다 : 예시적인 프로세스 쉬운 방법
칼의 대답은 훌륭했습니다. 많은 운영 체제에서 반환 값이 레지스터 중 하나에 전달된다는 것을 추가하고 싶습니다. x86 아키텍처에서이 레지스터는 eax 일 수 있습니다. ARM 아키텍처에서이 레지스터는 R0 일 수 있습니다.
각 프로세스에는 프로세스 제어 블록 (PCB)이 있습니다. 프로세스 제어 블록 (PCB)은 인터럽트, 시스템 호출 또는 예외가 발생하고 컨트롤이 OS로 전달되었습니다. 다음에 프로세스가 스케줄되면 레지스터 값이 PCB에서 복원됩니다. 포크()가 발생했을 때
이제, OS 할 수있다 : 프로세스가 재조정 될 때
child_process->PCB[return_value_register] = 0;
parrent_process->PCB[return_value_register] = child_pid;
그래서, 그들 각각은 서로 다른 반환 값을 참조하십시오.
예를 들어, xv6's implementation of fork을 볼 수 있습니다. 거기서, 부모 프로세스는 여전히 실행 상태이므로, 간단한 return 문을 사용하여 부모의 리턴 값을 반환합니다. 그러나 0으로 자식 프로세스에 대한 EAX 레지스터의 값을 설정, 그래서 자식 프로세스가 예약 된 경우는 반환 값으로 0을보고 : 0은 또한 "mov 인 EAX, 0"같은 것으로 컴파일 돌아
// Clear %eax so that fork returns 0 in the child.
np->tf->eax = 0;
참고.
업데이트 : 방금 내가 취미로 사용하는 OS에 fork()를 구현했습니다. 소스 코드 here을 볼 수 있습니다.
- 1. C를 사용하여 파이핑 ("|") 구현 (포크 사용)
- 2. 차이점 포크
- 3. 유닉스 포크
- 4. 파이프로 포크
- 5. 어떻게 포크()
- 6. 오버로드 포크()
- 7. 내 포크 과정은 내가 사용 아이 포크 내 주요 프로그램에서
- 8. 내가 Github에서의 REPO를 포크 한 다른 사람의 포크
- 9. 포크 :: 슈퍼 sh : 포크 : 재시도 : 아니 자식 프로세스
- 10. 포크 리턴은 정확히 무엇입니까?
- 11. github 포크 질문
- 12. CC.NET을 사용한 포크 프로세스
- 13. 포크 또는 스레드를 사용해야합니까?
- 14. 포크 후 읽기 선택
- 15. 포크 다음에 pthreads 생성
- 16. Leiningen 프로젝트에서 JVM 포크
- 17. Github - 개인 저장소 포크
- 18. 포크 후 호출 신호
- 19. C 새 tty 포크
- 20. 는 waitpid()와 포크()
- 21. 포크 후 파이프 만들기
- 22. 포크 핸들을 다시
- 23. 새로운 cygwin 터미널에 포크
- 24. 하위 프로세스 포크
- 25. 포크 - 부모 자식 프로그램
- 26. GitHub에서 프로젝트 포크
- 27. GitHub 및 포크
- 28. 유닉스의 여러 포크
- 29. C - 반복적 인 포크
- 30. 포크 - 조인에서의 메모리 가시성
리눅스 커널 소스 코드를 살펴볼 수 있습니다 ... – fge
OS가 프로세스를 생성 할 수 있다는 생각에 편안하고 각 프로세스의 주소 공간에 매핑 할 메모리 영역을 선택할 수 있습니까? –
이 질문에 어떤 점이 있습니까? – Svisstack