2014-04-19 2 views
1

3 개의 세마포어, 2 개의 카운팅 (카운트 MAX 5) 및 임계 섹션에 대한 1 개의 바이너리 세마포어를 사용하여 Bounded 버퍼 (버퍼 크기 5) 문제를 구현했습니다. 생산자와 소비자 프로세스가 분리되어 버퍼를 공유하고있었습니다.프로듀서 소비자 - 자식 프로세스에서의 세마포어 사용하기

그런 다음 공유 메모리 (버퍼)를 설정하는 하나의 상위 프로세스와 프로듀서 및 소비자와 같은 두 개의 하위 프로세스로 동일한 문제를 시도했습니다.

이전 코드에 구현 된 코드를 새 코드에 거의 복사했습니다 (Producer는 ret == 0 및 i == 0 블록으로 이동하고 Cons는 ret == 0 및 i == 1 블록으로 이동합니다. 자식 프로세스의 개수입니다.);

그러나 내 프로세스가 차단됩니다. 코드의 의사 구현은 다음과 같습니다. 단계가 올바른지 제안하십시오. 나는 세마포어와 그 가치의 공유에 잘못 될 것 같아요. 어쨌든 공유 메모리는 부모 프로세스와 두 자식 프로세스간에 암시 적으로 공유됩니다.

struct shma{readindex,writeindex,buf_max,char buf[5],used_count}; 

main() 
{ 
struct shma* shm; 
shmid = shmget(); 
shm = shmat(shmid); 

init_shma(0,0,5,0); 
while(i++<2) 
{ 
    ret = fork(); 
    if(ret > 0) 
     continue; 
    if(ret ==0) 
    { 
     if(i==0) 
     { 
     char value; 
     sembuf[3]; semun u1; values[] = {5,1,0}; // Sem Numbers 1,2,3 
     semid = semget(3 semaphores); 
     semctl(SETALL,values); 
     while(1) 
     { 
      getValuefromuser(&value); 
      decrement(1); 
      decrement(2); // Critical section 
      *copy value to shared memory* 
      increment(2); 
      increment(3); // used count 
     } 
     } 
     if(i==1) 
     { 
     char value; 
     sembuf[3]; semun u1; values[] = {5,1,0}; // Sem Numbers 1,2,3 
     semid = semget(3 semaphores); 
     semctl(SETALL,values); 
     while(1) 
     { 
      decrement(3); // Used Count 
      decrement(2); // Critical Section 
      read and print(&value); // From Shared Memory 
      increment(2); 
      increment(1); // free slots 
     } 
     } 
    } 
}//while 
Cleanup Code. 
}//main 

두 자식 프로세스 모두에서 세마포어 ID를 가져와야합니까? 아니면 누락 된 것이 있습니까?

답변

1

의사 코드 구현은 이와 유사합니다. ftok 또는 하드 코딩 된 키를 사용하여 동일한 키를 사용하는 하위 프로세스에서 세마포어 ID를 가져온 다음 세마포어의 현재 값을 가져 와서 적절한 작업을 수행합니다.

struct shma{readindex,writeindex,buf_max,char buf[5],used_count}; 

main() 
{ 
struct shma* shm; 
shmid = shmget(); 
shm = shmat(shmid); 

init_shma(0,0,5,0); 
sembuf[3]; semun u1; values[] = {5,1,0}; // Sem Numbers 1,2,3 
semid = semget(3 semaphores); 
semctl(SETALL,values); 

while(i++<2) 
{ 
    ret = fork(); 
    if(ret > 0) 
     continue; 
    if(ret ==0) 
    { 
     if(i==0) 
     { 
     char value; 
     sembuf[3]; semun u1; values[]; 
     semid = semget(3 semaphores); 

     while(1) 
     { 
      getValuefromuser(&value); 
      decrement(1); 
      decrement(2); // Critical section 
      *copy value to shared memory* 
      increment(2); 
      increment(3); // used count 
     } 
     } 
     if(i==1) 
     { 
     char value; 
     sembuf[3]; semun u1; values[]; 
     while(1) 
     { 
      getValuefromuser(&value); 
      decrement(3); // Used Count 
      decrement(2); // Critical Section 
      read and print(&value); // From Shared Memory 
      increment(2); 
      increment(1); // free slots 
     } 
     } 
    } 
}//while 
Cleanup Code. 
}//main 
1

궁극적으로 내 이해에 문제가 있음을 발견했습니다.

상위 프로세스에서 세마포 또는 세 개의 세마포를 생성 및 설정 한 다음 해당 프로듀서 및 소비자 하위 프로세스에서 해당 값을 가져와 적절하게 사용해야합니다.

이전에는 생산자와 소비자 모두에서 세마포를 만들었습니다. 어리석은 나를 !!