2011-02-16 8 views
4

특정 개수의 동시 하위 프로세스를 만들어야합니다. 또한 각 하위 프로세스가 전역 변수를 수정하여 주 상위 프로세스가 마지막 수정 된 버전에서이를 인쇄 할 수있게하려고합니다. 아래 프로그램을 실행하면 'k'의 최종 값은 5가되므로 전역 변수가 변경되지 않습니다. "exit (0)"부분을 제거하면 전역 변수가 변경되지만 이번에는 생성 된 하위 프로세스의 수가 더 커집니다.fork()를 사용하여 특정 수의 자식 프로세스를 만드는 방법

fork()를 사용하면 주 상위 프로세스에서 데이터 (전역 변수, 지역 변수 등)를 수정할 수있는 X 프로세스의 하위 프로세스를 어떻게 만들 수 있습니까?

int k = 5; // global variable 

int main(){ 

    int i=0; 
    int status; 

    for(i = 0; i<5; i++){ 
    if(fork() == 0){ 
     printf("child %d %d\n", i, ++k); 
     sleep(5); 
     printf("done %d\n",i); 
     exit(0); 
    } 
    } 

    return 0; 
} 
+1

당신은 자신의 질문에 대답했습니다. for-loop를 사용하십시오. –

+0

그래,하지만 k는 10 대신 5가 될거야. 그게 문제 야. – user246392

+0

"자식 프로세스가 전역 변수를 수정하는 방법"이 아닌 'fork'가 작동하는 것 같아요. '스레드'라고 생각 하시겠습니까? – Kevin

답변

1

자식 프로세스는 기본적으로 부모의 주소 공간에서 어떤 것도 변경할 수 없습니다. 경쟁 환경을 방지하기위한 뮤텍스 메커니즘뿐만 아니라이를 위해 공유 메모리가 필요합니다.

2

이렇게하면 안됩니다. 포크는 메모리 페이지를 새로운 프로세스로 복사 (또는 copy-on-write)하는 새로운 프로세스를 생성합니다. 즉, 각 하위 프로세스는 "k"사본을 가져 오며 "k"사본은 한 번만 증가합니다.

모든 프로세스가 "동일한"k 변수로 다시 통신하도록하려면 일종의 프로세스 간 통신을 수행해야합니다. 좋은 프로세스 간 통신

예 :

  1. 부모 프로세스는 K의 값을 저장하는 공유 메모리 세그먼트를 생성하게한다. 자식 프로세스가 (부모 프로세스가 만든 뮤텍스를 통해) 공유 메모리 세그먼트의 독점 잡을 기다린다. 자식이 배타 잠금을 가질 때 자식이 k 값을 읽고 k + 1의 값을 저장하게하십시오.

  2. 자식 프로세스간에 부모 프로세스간에 프로세스 파이프를 만듭니다. 부모에게 k를 증가시키려는 메시지를 나타내는 파이프를 읽게하십시오. 부모 프로세스가 자식을 대신하여 k를 증가 시키도록하십시오. 열악한 프로세스 간 통신

예 :

  1. K의 변화 (즉, 두 개의 경합 아이들 수도 동일한 값을 모두 증가 K 의미) 원자되도록하지 않음 용액. 이러한 걱정의 부족은 설정 값이 (2, 3, 3, 4, 5)처럼 보일 수 있으므로 K 값이 자식 프로세스의 수보다 더 적게 증가하는 것으로 나타납니다. 즉, 독점적 인 액세스를 위해 파일을 잠그는 원자 적 조작을 보장하는 프레임 워크를 프레임 워크로 작성하지 않으면 파일 I/O가 거의 쓸모가 없음을 의미합니다.
0

자식 프로세스는 부모 주소 공간이 이됩니다. 즉, 모든 하위 프로세스에는 자체 전역 변수 복사본이 있습니다.

모든 하위 프로세스와 상위 프로세스가 동일한 변수를 공유 할 수 있도록 변수를 공유 메모리 매핑에 넣어야합니다.

1

프로세스는 정의에 따라 다른 프로세스 (예 : 글로벌 변수 등)의 리소스를 직접 수정할 수 없습니다. 이를 위해 프로세스가 아닌 스레드를 사용하려고합니다. pthread_create (3) 또는 clone (2)을 살펴보십시오.

관련 문제