2014-11-21 4 views
0

부모 프로세스가 있고 3 개의 하위 프로세스를 만들고 싶은 프로그램이 있습니다.읽기 - 쓰기 공유 메모리

또한 각 공유 메모리에 대해 2 개의 공유 메모리 (IN, OUT)와 1 개의 세마포어를 만들었습니다.

아이디어는 다음과 같습니다

부모 프로세스는 3 개 정수를 가지고 있으며, 공유 메모리 (IN)이 정수 중 하나에 쓸 수있다. 그런 다음 자식 프로세스 중 하나가이를 읽고 일부 계산을 수행하고 부모가 결과를 읽는 공유 메모리 (OUT)에 내용을 씁니다. 그런 다음 부모 프로세스가 공유 메모리에 다음 정수를 추가하고 등등 ..

이 내가 첫 번째 부분을 구현하려고 내 코드의 일부는 (공유 메모리 IN에서 쓰기 읽기) :

// create and attach shared memory 

memidIN = shmget(...); 
memidOUT= shmget(...);   
pointerIN = (...) shmat(...);  
pointerOUT = (...) shmat(...);  

// create and init semaphores 

semIN = semget(...); 
semOUT = semget(...); 
semctl(semIN, ...); // initialize both to 1 
semctl(semOUT, ...); 

for (i = 0; i < children; ++i) 
{ 
    pid = fork(); 

    if (pid) 
    { 
     // parent process code 

     down sem_IN 
      write in shmIN 
     up sem_IN 

    } 
    else if (pid == 0) 
    { 
     // Children processes code 

     down sem_IN 
      read from shmIN 
     up sem_IN 

     exit(0);  

    } 
    else 
     //ERROR 


} 

    // dont die until childrens die 
    for(j = 0; j < children; j++) 
     wait(&status); 

질문은 어떻게 아이들 프로세스가 올바른 값을 읽는지 확신 할 수 있습니까? 내 말은 부모 프로세스가 5를 쓰면 하나의 프로세스가 그것을 취해야하고, 뭔가를하고, OUT에 뭔가를 써야합니다. 그런 다음 부모는 다른 값을 써야합니다. 10을 말하십시오. 내 프로그램에서 2 번 이상 자식 프로세스가 읽을 수 있습니다.

뮤텍스 세마포어를 사용하여 하위 프로세스가 올바른 값을 읽고 하위 프로세스 중 하나가 값을 읽었을 때 부모 프로세스가 값을 업데이트하는지 확인해야합니까?

아이디어가 있으십니까?

답변

0

그래서, 당신은이 방법으로 공유 메모리에 당신의 데이터를 정렬 할 수 있습니다 : 당신이 번호를 전달해야하는 경우

int Number; 
bool Number_IsRead; // Initialized by 'true'. 

, 당신이해야 할

Number_IsRead = false; 

아이 읽기 전에 Number_IsRead을 확인해야 번호. Number가 읽은 경우 자식은 Number_IsRead에 true를 할당해야합니다.

Number를 읽어야하는 어린이가 3 명인 경우 3 개의 플래그 (bool Number_IsRead [3])를 만들어야합니다. Number 또는 Number_IsRead를 변경할 때도 세마포를 사용해야합니다.

P. 일반적으로 메시지 대기열 (msgget/msgctl/msgsnd/msgrcv/etc) 대신 공유 메모리를 사용하는 것은 좋지 않습니다.

관련 문제