当前位置:  技术问答>linux和unix

cceczjxy 大侠,看看我的有名管道程序,急啊

    来源: 互联网  发布时间:2016-02-21

    本文导语:  一个有名管道通信类,两个进程派生于这个类,互相对发,刚开始好好的,但过一段时间就不发了,怎么回事,万分着急 Aa::Aa(void)  {  init();  }  Aa::~Aa()  {  m_bStop   =   true;  sem_destroy(&m_semFull);        sem_destr...

一个有名管道通信类,两个进程派生于这个类,互相对发,刚开始好好的,但过一段时间就不发了,怎么回事,万分着急
Aa::Aa(void) 

init(); 

Aa::~Aa() 

m_bStop   =   true; 
sem_destroy(&m_semFull);       
sem_destroy(&m_semEmpty);   


bool   Aa::init() 

sem_init(&m_semFull,   0,   0);       
sem_init(&m_semEmpty,   0,   1);       
//   add   end     
//       Create       a       thread       to       serve       each       pipe       instance   
                //sleep(1); 
int   ret=   pthread_create(   &fn,   NULL,   thr_rev,   (void*)this   );         
if(ret!=0) 


return   false; 

else 



ret=   pthread_create(   &fn,   NULL,   thr_snd,(void*)this);         
if(ret   !=   0) 


return   false; 

else 


}   
return   true; 

void   *   Aa::thr_rev(   void   *arg   ) 


int   readfifo,writefifo,readfd,writefd,   dummyfd; 
                
if((mkfifo(”abcd”,O_CREAT ¦0666)  m_PipeName,O_RDWR,   0   ); 
                //   dummyfd   =   open(   pProcessCom-> m_PipeName,O_WRONLY,   0   ); 
while(1) 

 readfd   =   open(   pProcessCom-> m_PipeName,O_RDWR,   0   ); 
                    
if(read(   readfd,   &recbuf,   sizeof(recbuf.msgHead.iLength))> 0   )       
{       
                                    if(   read(   readfd,   &(recbuf.msgHead.iMsgID),   recbuf.msgHead.iLength+sizeof(int))> 0   ) 




                                                memset(   &recbuf   ,0   ,   sizeof(sRecbuf)   ); 
}       

                  //close(readfd); 
                //   unlink(pProcessCom-> m_PipeName); 
return   NULL; 



bool   Aa::send(sf_pid   pid,   int   siCmd,   const   char*   text,   int   length) 


                sem_wait(   &m_semEmpty   ); 
          
sprintf(m_pSndPara-> tempPipeName,   "%s%da",m_pathName,pid); 
sem_post(   &m_semFull   ); 
return   true; 



void   *   Aa::thr_snd(   void   *arg   )   
{     

while(   true   ) 


sem_wait(   &(pProCom-> m_semFull)   ); 
                                printf("pipe   is   null!n"); 

int   writefd   =   open(   pProCom-> m_pSndPara-> tempPipeName,   O_WRONLY ¦O_NONBLOCK,   0   ); 

if(   writefd   ==   -1   ) 


sem_post(   &(pProCom-> m_semFull)   ); 
continue; 



int   ret   =   write(   writefd,pTemp,   pProCom-> m_pSndPara-> msg.msgHead.iLength   +   2*sizeof(int)); 

                                close(writefd); 
                              //   sleep(1); 
sem_post(   &(pProCom-> m_semEmpty)   ); 

return   NULL; 



|
看了一下,感觉问题可能在这
int writefd = open( pProCom->m_pSndPara->tempPipeName, O_WRONLY|O_NONBLOCK, 0 );

根据你的send函数和sendByProcType感觉tempPipeName可能是变化的名字.这样就可能存在读写的管道不是同一个管道的情况.
另外,有可能是你消费着函数send.
还有就是bool CProcessCom::sendByProcType( PT_HANDLE iProcessType, int siCmd, char* text, int length )这个函数是在怎么回事?
在声明中没有它,但它调用了send(生产者)函数.

send函数怎么定义两遍呀?
再者,send是个public,如果是有外部来调用这个生产者函数,是不是外部的调用中止了?

我没用c++做过,了解不是太多.
建议你跟踪一下,看卡在那了.

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • cceczjxy 来此帖接分


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3