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를 가져와야합니까? 아니면 누락 된 것이 있습니까?