当前位置: 技术问答>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;
}
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++做过,了解不是太多.
建议你跟踪一下,看卡在那了.
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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。