오래 전, 나는 유닉스 전문 컨설턴트라고 주장하는 런던의 아주 이상한 회사와 인터뷰를 하러 갔다. 어쨌든 이 사람들은 미쳤고 당연히 회사가 더 이상 존재하지 않는 것 같지만 인터뷰 중에 그들은 나에게 다음과 같은 질문을 했습니다.
새로운 프로세스를 시작하기 위한 첫 번째 요청은 무엇입니까?
그래서 첫 번째 전화는 이라고 대답했습니다 fork
. 저를 인터뷰한 두 분은 (아주 뻔한 사실을 놓친 듯 아주 집요하게) 이렇게 말씀하셨습니다.
당신은 무엇을 부르고 있습니까?앞으로포크를 만드시나요?
이제 저는 이 문제에 대해 전혀 아는 것이 없으며 이 사람들은 이 문제와 전혀 관련이 없는 이유로 자신들이 완전한 바보라고 믿게 만들었지만 어떤 이유에서인지 이 문제는 지금도 여전히 나를 괴롭히고 있습니다. 포크 이전에 통화가 이루어졌나요? 제가 약간의 미묘함을 놓쳤나요?
답변1
추측만 할 수 있기 때문에 이것을 답으로 말하기는 쉽지 않습니다. 그러나 다음과 같습니다.
- 하위 프로세스가 실행 전에 출력을 원하는 경우 표준 출력을 플러시합니다.
새 프로세스에 셸에서 얻은 "표준" 환경이 필요하다고 가정하고 2보다 큰 열려 있는 파일 설명자를 모두 닫습니다.- 일부 모호한 변형에는 모호한 것이 필요합니다.유니스아무리 똑똑해도 그들은 이것을 알고 있습니다.
그럼에도 불구하고, 모호한 사실에 관한 질문을 하는 것은 그들이 어리석은 질문에 어떻게 대답하는지를 제외하고는 후보자에 대해 아무것도 드러내지 않습니다.
답변2
내 생각에는 부모 프로세스가 자식 프로세스의 표준 입력 또는 표준 출력을 제어할 수 있는 방법을 제공하기 위해 "파이프"를 호출해야 한다는 의미인 것 같습니다. 이는 "포크" 이전에 발생하는 가장 일반적인 호출입니다.
동의합니다. 이것은 끔찍한 질문입니다. 파이프라인 등의 일부로 프로세스를 생성한다고 명시한다면 좋은 질문이 될 것입니다. 작업 순서를 이해하는 것이 중요합니다. "포크" 앞에 파이프를 만든 다음 각 프로세스에서 사용되지 않은 반대쪽 끝을 닫고 "dup2"를 사용하여 자식 프로세스의 설명자를 올바른 위치에 배치하고 "exec" 'Child'를 호출합니다. 기능, 처리 실패 등
(전문가의 추측이 있다는 사실은 그것이 나쁜 질문이라는 것을 증명합니다.)
답변3
내 추측은
- 그들은 버퍼 플러시와 같이 언급하기에는 너무 게으른 특정 경우에만 적용되는 것을 고려하고 있습니다.
- 아니면 당신이 뭔가를 할 것이라는 뜻이에요뒤쪽에분기;
- 아니면 당신이 뭔가를 할 것이라는 뜻이에요앞으로
execve
(다른 프로그램을 생성하는 나머지 절반) 답변을 기대fork
하지만 실제로는 전체를 이해하지 못하고 둘을 혼동합니다.