我使用三个信号量实现了有界缓冲区(缓冲区大小5)问题,两个计数(计数MAX 5)和一个二进制信号量用于临界区。 生产者和消费者流程是分开的,并且共享缓冲区。
然后我继续尝试同样的问题,这次是使用One Parent进程设置共享内存(Buffer)和两个子进程,它们就像Producer和consumer。
我几乎将先前代码中已实现的内容复制到新代码中(Producer进入ret == 0和i == 0块,Consumer进入ret == 0和i == 1 block..Here i is子进程的计数);
但是我的进程阻止了。代码的伪实现如下: 请建议步骤是否正确。我想我可能在分享信号量及其价值方面出错了。无论如何共享内存在父进程和两个子进程之间隐式共享。
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。或者还有其他缺失的东西。
答案 0 :(得分:1)
我最终发现我的理解存在问题。
我必须在父进程中创建并设置一个信号量或三个信号量,然后在相应的生成器和消费者子进程中获取它们的值,然后相应地使用它们。
我早些时候,在生产者和消费者中创建信号量。 傻我!! !!
答案 1 :(得分:1)
伪代码实现将是这样的。使用相同的密钥,使用ftok或hardcoded密钥获取子进程中的信号量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