2014-04-19 75 views
1

我已经实现了使用三个信号量,两个计数(计数为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 ..或者还有其他的东西丢失。

回答

1

伪代码的实现将是这样的。使用相同的密钥在子进程中获取信号量ID,使用ftok或硬编码密钥,然后获取信号量的当前值,然后执行相应的操作。

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

我最终发现我的理解有问题。

我必须在父进程中创建并设置一个信号量或三个信号量,然后在相应的生产者和消费者子进程中获取它们的值,然后相应地使用它们。

我早些时候在生产者和消费者中都创造了信号量。 傻我。