我已经实现了使用三个信号量,两个计数(计数为MAX 5)和一个用于临界区的二进制信号量的Bounded buffer(Buffer size 5)问题。 生产者和消费者流程是分开的,共享缓冲区。生产者消费者 - 在子进程中使用信号量进程
然后我继续尝试同样的问题,这次使用一个父进程设置共享内存(缓冲区)和两个像生产者和消费者一样行事的子进程。
我几乎将先前代码中实现的任何东西复制到新的代码中(生产者进入ret == 0并且i == 0块并且消费者进入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 ..或者还有其他的东西丢失。