문제

해결해야 할 문제가 있는데 어떻게 해야 할지 모르겠습니다. 문제를 해결하는 데 사용할 수 있는 시스템 호출이 몇 개밖에 없고 상황에 어떻게 도움이 되는지 알 수 없기 때문입니다.

운동:
정수가 포함된 [10][1000000] 크기의 행렬이 있고 각 줄에 대해 fork()를 사용하여 새 프로세스를 만듭니다.각 프로세스의 아이디어는 해당 특정 라인의 모든 번호를 살펴보고 특정 번호를 찾은 다음 이에 대한 메시지를 인쇄하는 것입니다.이것이 문제의 첫 번째 단계였으며 완료되었습니다.두 번째 단계는 각 줄에서 해당 숫자의 총 발생 횟수를 인쇄하는 것입니다. 순서대로.그리고 결국에는 해당 숫자의 총 발생 횟수입니다.

통화:
사용할 수 있는 시스템 호출은 이 연습 문서에 다음과 같이 설명되어 있습니다.

  • pid_t fork(void);
  • void exit(int status);
  • pid_t wait(int *status);
  • pid_t waitpid(pid_t pid, int *status, int options);

문제:
어떻게 해야 할지 모르겠어요. 왜냐하면 exit() 호출을 사용하면 256 미만의 숫자만 전달할 수 있습니다. 발생 횟수가 이 숫자보다 크면 어떻게 되나요?그러한 번호를 어떻게 반환해야 합니까?

또 다른 문제:
나는 그 차이를 정확히 이해하지 못한다. wait() 그리고 waitpid() 그리고 하나를 다른 것보다 어떻게/어디에 사용하는지.매뉴얼 페이지 외에도 코드 예제 등을 더 잘 이해할 수 있는 문서가 더 있습니까?아니면 누군가 나에게 차이점을 설명하고 그러한 차이점을 보여주는 기본적인 예를 제공할 수 있습니까?

도움이 되었습니까?

해결책

사용 waitpid() 하위 프로세스의 종료 상태를 순서대로 수집합니다.사용하여 wait() 어린이 시체가 회수되는 순서에 대해 보장하지 않습니다.

Unix에서 종료 상태는 8비트로 제한되며, 이는 데이터를 검색하는 프로그램에 의해 부호 있는 또는 부호 없는 것으로 처리될 수 있습니다.또한 종료된 하위 항목의 신호 번호와 코어 덤프 상태를 식별하는 8비트 값도 얻습니다.AFAIK, 상태 또는 신호 비트는 항상 0입니다(그리고 종종 둘 다 - 프로세스가 성공적으로 종료될 때).

반환될 숫자가 256보다 작다는 것을 모르는 경우 종료 상태는 올바른 방법이 아닙니다.다른 사람들이 말했듯이, 이 경우에는 다른 IPC를 사용해야 합니다.허용되는 유일한 시스템 호출이 해당 시스템 호출이라면 값이 255보다 작거나 오버플로가 중요하지 않다고 결론을 내려야 합니다.숙제 외의 결론으로는 둘 다 만족스럽지 않지만 '실제 세계'에서는 시스템 호출이 4개로 제한되지 않습니다.

또한보십시오 종료 코드가 255보다 큽니까?.Windows에서는 종료 코드의 범위가 훨씬 더 크지만 질문에 나열된 시스템 호출을 사용하지 않습니다.


관찰:내가 할 때 exit(1), 상태 값 wait() 256입니다;그럴 이유가 있나요?

답변:예.상태어의 하위 8비트는 신호 번호 등을 인코딩합니다.(16비트) 상태 워드의 상위 8비트는 종료 상태를 인코딩합니다.

보다 <sys/wait.h> 및 매크로 WIFEXITED(), WEXITSTATUS() 등

다른 팁

나는 당신이하고있는 일이 잘 작동해야한다고 생각합니다. 프로세스의 종료 코드로 발생 수를 반환하십시오.

exit ()는 256 미만의 숫자 만 허용 할 것이라고 언급합니다. 이것이 사실인지 의심하지만, 테스트 프로그램을 작성하는 것이 확실합니다.

이것은 실제로 단순화 된 버전 일 것 같습니다. 맵 레디스. 프로그램을 더 병렬화 할 수있는 방법에 대한 몇 가지 아이디어에 대한 알고리즘을 살펴보고 추가 크레딧을 얻을 수 있습니다. :)

Wait ()와 waitpid ()의 차이점은 자녀 프로세스가 완료되기를 기다리려면 Wait ()를 사용합니다. 특정 아동 과정을 기다리려면 또는 자녀 과정이 교수형없이 종료되었는지 확인하고 싶다면 WaitPid ()를 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top