fork()
부모 프로세스와 자식 프로세스에서 함수가 다른 값을 반환하는 이유는 무엇입니까 ?
상위 프로세스나 하위 프로세스 모두 쓰기 작업이 없다고 가정합니다.
답변1
부모나 자식 모두 상대방의 메모리에 pid를 넣을 필요가 없습니다.
포크가 발생하면 커널은 상위 프로세스의 전체 프로세스 공간을 복사하는 작업을 맡게 됩니다(이는 전체 복사 없이도 달성할 수 있습니다. 예를 들어 처음에 페이지 테이블 항목을 복사하여 일부 메모리에 기록하는 방식입니다).
시스템 호출 중에 커널은 사용자 프로세스를 사용자 모드로 반환하기 전에 사용자 프로세스 스택을 복구하여 호출의 반환 값을 전달할 수 있습니다. 시스템 호출의 모든 반환 값이 나오는 곳입니다.
커널이 부모와 자식의 값이 서로 다른 두 스택 프레임을 수정하는 것은 전혀 문제가 되지 않습니다. 두 프로세스 모두 실행 중이 아니며 둘 다 시스템 호출 중이므로 스택 프레임이 잘 정의되어 있고 모든 메모리가 커널에 액세스할 수 있습니다.