errno 11 [EAGAIN] из прочитанного (2) - PullRequest
3 голосов
/ 12 апреля 2011

У меня есть код, который читает последовательный порт на моем пингвин-боксе.Код выглядит так:

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 я могу понять, что 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 Выход Iполучить при инъекции, после примерно 30 сообщений (то есть после приблизительно 30 потоков - иногда немного больше, а иногда немного меньше) НЕ УКАЗАНО для чтения порта (11) Ресурс временно недоступен _Signal 11_

Спасибо, что уделили мне время, я очень благодарен.

1 Ответ

3 голосов
/ 22 апреля 2011

У вас есть 30 потоков, заблокированных на select (), которые все будут читать fOut, когда он станет читаемым - тогда проигравшие дадут вам EAGAIN, когда буфер опустошен?

...