生产者消费者 - 在子进程中使用信号量

时间:2014-04-19 19:14:33

标签: linux operating-system semaphore producer-consumer

我使用三个信号量实现了有界缓冲区(缓冲区大小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。或者还有其他缺失的东西。

2 个答案:

答案 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