포크하기 전에 무엇을 호출해야 합니까?

포크하기 전에 무엇을 호출해야 합니까?

오래 전, 나는 유닉스 전문 컨설턴트라고 주장하는 런던의 아주 이상한 회사와 인터뷰를 하러 갔다. 어쨌든 이 사람들은 미쳤고 당연히 회사가 더 이상 존재하지 않는 것 같지만 인터뷰 중에 그들은 나에게 다음과 같은 질문을 했습니다.

새로운 프로세스를 시작하기 위한 첫 번째 요청은 무엇입니까?

그래서 첫 번째 전화는 이라고 대답했습니다 fork. 저를 인터뷰한 두 분은 (아주 뻔한 사실을 놓친 듯 아주 집요하게) 이렇게 말씀하셨습니다.

당신은 무엇을 부르고 있습니까?앞으로포크를 만드시나요?

이제 저는 이 문제에 대해 전혀 아는 것이 없으며 이 사람들은 이 문제와 전혀 관련이 없는 이유로 자신들이 완전한 바보라고 믿게 만들었지만 어떤 이유에서인지 이 문제는 지금도 여전히 나를 괴롭히고 있습니다. 포크 이전에 통화가 이루어졌나요? 제가 약간의 미묘함을 놓쳤나요?

답변1

추측만 할 수 있기 때문에 이것을 답으로 말하기는 쉽지 않습니다. 그러나 다음과 같습니다.

  1. 하위 프로세스가 실행 전에 출력을 원하는 경우 표준 출력을 플러시합니다.
  2. 새 프로세스에 셸에서 얻은 "표준" 환경이 필요하다고 가정하고 2보다 큰 열려 있는 파일 설명자를 모두 닫습니다.
  3. 일부 모호한 변형에는 모호한 것이 필요합니다.유니스아무리 똑똑해도 그들은 이것을 알고 있습니다.

그럼에도 불구하고, 모호한 사실에 관한 질문을 하는 것은 그들이 어리석은 질문에 어떻게 대답하는지를 제외하고는 후보자에 대해 아무것도 드러내지 않습니다.

답변2

내 생각에는 부모 프로세스가 자식 프로세스의 표준 입력 또는 표준 출력을 제어할 수 있는 방법을 제공하기 위해 "파이프"를 호출해야 한다는 의미인 것 같습니다. 이는 "포크" 이전에 발생하는 가장 일반적인 호출입니다.

동의합니다. 이것은 끔찍한 질문입니다. 파이프라인 등의 일부로 프로세스를 생성한다고 명시한다면 좋은 질문이 될 것입니다. 작업 순서를 이해하는 것이 중요합니다. "포크" 앞에 파이프를 만든 다음 각 프로세스에서 사용되지 않은 반대쪽 끝을 닫고 "dup2"를 사용하여 자식 프로세스의 설명자를 올바른 위치에 배치하고 "exec" 'Child'를 호출합니다. 기능, 처리 실패 등

(전문가의 추측이 있다는 사실은 그것이 나쁜 질문이라는 것을 증명합니다.)

답변3

내 추측은

  • 그들은 버퍼 플러시와 같이 언급하기에는 너무 게으른 특정 경우에만 적용되는 것을 고려하고 있습니다.
  • 아니면 당신이 뭔가를 할 것이라는 뜻이에요뒤쪽에분기;
  • 아니면 당신이 뭔가를 할 것이라는 뜻이에요앞으로 execve(다른 프로그램을 생성하는 나머지 절반) 답변을 기대 fork하지만 실제로는 전체를 이해하지 못하고 둘을 혼동합니다.

관련 정보