2012-02-05 4 views
9

그건 내 코드입니다.C에서 하위 프로세스를 올바르게 fork()하는 방법은 무엇입니까?

#include <stdio.h> 
#include <stdlib.h> 

int main (int argc, char *argv[]) 
{ 
    int i, pid; 

for(i = 0; i < atoi(argv[1]); i++) { 
    pid = fork(); 
    if(pid < 0) { 
     printf("Error"); 
     exit(1); 
    } else if (pid == 0) { 
     printf("Child (%d): %d\n", i + 1, getpid()); 
     exit(0); 
    } else { 
     wait(NULL); 
    } 
} 

} 

출력은 다음과 같습니다.

Child (1): 5676 
Child (2): 4624 
Child (3): 4800 
Child (4): 5596 
Child (5): 5580 

그러나 내 숙제에 예상되는 결과가 아닙니다. 그렇게되어야합니다. 코드에 어떤 문제가 있습니까? 누군가 나를 도울 수 있습니까?

Child (2): 4625 
Child (1): 4624 
Child (3): 4626 
Child (4): 4627 
Child (5): 4628 

감사합니다. 이제 나는 그것을 시도 할 것이다.

P. 미안해 내 영어가 나쁘다. 내가 한 말을 이해할 수 있기를 바랍니다.

답변

3

코드가 내 컴퓨터에서 완벽하게 작동합니다. 그것은 OS 의존적 일 수 있습니다.

그러나 인수가 프로그램에 주어지지 않으면 세그먼트 화 오류를 피하기 위해 argc가 1이 아닌지 확인해야합니다.

+0

제안 해 주셔서 감사합니다. –

+0

예, 실제로 운영 체제에 따라 다릅니다. 학교의 Linux 서버에서 프로그램을 테스트했습니다. 나는 예상 결과를 얻었다. 고맙습니다. –

1

시스템은 프로세스에 할당 할 자유 PID를 사용합니다. 프로세스 ID를 4000으로 포크하고 자식 ID가 3900이 될 수 있습니다. 숙제 용지는 첫 번째 프로세스 ID가 결코 동일하지 않으므로 숫자를 입력하지 않아야합니다.

+0

감사합니다. 숙제에 포함 된 프로그램에 대한 설명을 제공했습니다. 도와주세요. –

1

출력 순서가 정렬되지 않은 이유는 정확하게 어떤 자식이 활성화 될지 예측할 수 없기 때문입니다. 따라서 귀하의 제 2 자녀가 fork()에 등록되어 시작될 때까지 1 차 자녀의 집행이 지연 될 수 있습니다.

자녀가 일반적으로 OS에 따라 다르지만 순차적 PID를 얻습니다.

두 가지 문제는 예약 된 작업에 문제가 없어야합니다. 절대 PID는 중요하지 않습니다 (모든 OS는 자체적으로 작업 할 수 있으며 PID를 순차적으로 또는 무작위로 할당 할 수 있음). 자식들은 자신의 작업을 수행합니다. 자식의 각 부분은 서로 다른 실행 시간을 가질 수 있으며 결과적으로 정렬되지 않은 결과가 발생할 수 있습니다. 이것은 데이터가 올바르게 전송되는 한 카운트합니다. 상위가 시퀀스를 생성 한 다음 포크하는 경우입니다. 이 경우 자식 프로세스의 메모리 레이아웃은 fork 할 때의 부모와 같습니다. 따라서 부모는 이미 실행중인 자식에 영향을 미치지 않고 "데이터 전송 배열"을 수정할 수 있습니다.

혼란을 줄이기 위해 모든 행에서 PID 출력을 제거 할 수 있습니다. 어쩌면 그것들은 자식 프로세스의 각각의 시작에서 출력 될 수 있지만, 그 후에는 예를 들어, Child 3: straight length 6 <S6,H5,C4,S3,H2,SA> PID를 반복하지 않습니다.

+0

감사합니다. 숙제에 포함 된 프로그램에 대한 설명을 제공했습니다. 도와주세요. –

+1

pid 할당은 OS 종속적 일뿐만 아니라 자식 프로세스의 예약은 런타임에 따라 다릅니다. 첫 번째 자식이 실행되도록 예약 된 첫 번째 자식이라는 보장은 없습니다. – tbert

+0

@tbert Exactl은 내가 내 대답의 "첫 번째"섹션으로 말하고자하는 것으로, 예측 된 내용을 언급하는 섹션입니다. – glglgl

1

예상되는 출력으로 숙제는 먼저 모든 프로세스를 포크하고 대기 호출해야합니다.

는 단순히 루프에서 대기 호출을 건너 뛰고 그해야 아래에 별도의 하나를 수행 루프 wait 반환 -1ECHILDerrno 세트까지. 아이들의 출력 순서는 무작위이거나 적어도 순서대로는 아니기 때문에 반드시 필요하지는 않습니다. 2 1 3 4 5

이것은 단지 추측입니다. 더 많은 정보를 원하면 더 많은 정보를 제공해야합니다 특정 답변.

+0

고맙습니다. 숙제에 포함 된 프로그램에 대한 설명을 제공했습니다. 도와주세요. –

관련 문제