我有一些代码可以读取pinguin盒子上的串口。 代码就像:
while ( 1 )
if ( select( handle + 1, &h, NULL, NULL, &tm ) > 0 )
{
if( read( handle, &msg, 1 ) > 0 )
{
... tips and trixes
}
if ( gotWhatINeed ) break;
代码运行很长时间没关系,但是如果我试着强调一点,我会开始不断地获得errno 11(EAGAIN),即使在压力完成之后。 现在我想知道我误解了什么,从man 2中选择我可以理解select返回句柄中可用的字节数。
可能感兴趣的是代码总是在分离的线程中运行。
根据评论,我现在发布更多代码细节。
主要是我
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
int main ( int argc, char **argv )
{
pthread_t scan_01
signal( 11, OnSignal );
pthread_mutex_init( &mut, NULL );
.....
pthread_create(&scan_01, NULL, (void *)readDevice, NULL);
pthread_detach(scan_01);
以及读取设备的方法。 TGM是一种用于保存数据读取的结构。 OnSignal只记录信号。 _note:ques
void *readDevice(void)
{
int r;
char b[256];
struct TGM tgm;
pthread_t new, self;
pthread_mutex_lock( &mut );
self = pthread_self( );
while( 1 )
{
FD_ZERO( &out );
FD_SET( fOut, &out );
tm.tv_sec = LOOP_DELAY;
tm.tv_usec = com_scan_time;
if ( select( fOut + 1, & out, NULL, NULL, &tm ) > 0 )
{
r = readPort( fOut, 10, b, 1 );
pthread_mutex_unlock( &mut );
pthread_create( &new, NULL, (void *)readDevice, NULL );
pthread_detach( new );
iThreads++;
...
break;
}
}
self = pthread_self();
iThreads--;
pthread_exit( & self );
readPort就像,主要任务是“只是”将位和字节转换为TGM。
int readPort(const int handle, char terminator, char b[256], int crc)
{
char msg;
fd_set h;
struct timeval tm;
do
{
FD_ZERO( &h );
FD_SET( handle, &h );
tm.tv_sec = LOOP_DELAY;
tm.tv_usec = com_scan_time;
if ( select( handle + 1, &h, NULL, NULL, &tm ) > 0 )
{
if( read( handle, &msg, 1 ) > 0 )
{
if( msg == 3 ) // marks end of message
....
}
else
{
log( ERRLOG, "FAILED to read port (%d) %s\n",
errno,
strerror( errno ) );
return -1;
}
现在我的失败在哪里:D 注入时得到的输出,在大约30条消息之后(意味着在aprox之后.30个线程 - 有时多一点,有时少一点) FAILED读取端口(11)资源暂时不可用 _Signal 11 _
感谢您对我使用一段时间,我非常感激。
答案 0 :(得分:3)
你有没有30个线程全部被select()阻塞,当它变得可读时所有竞争对手都读取了 - 那么当缓冲区耗尽时,输家会给你EAGAIN吗?