ioctl(descr,FIONREAD,&size)

Тема в разделе "WASM.UNIX", создана пользователем dag, 25 окт 2006.

  1. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    subj возвращет -1 в случае если скармливаем descr с обычного файла ... это ваще нормально ?
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    А что он может ещё вернуть - размер файла?
     
  3. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    типа st_blksize или размер буфера какого нибудь ...
    вопрос возник в связи вот с этим куском
    Код (Text):
    1. if (ioctl(fd,FIONREAD,&i)) == -1)
    2.   return (-1);
    в этот самый fd переодически скармливается сокет с ним всё понятно, а переодически файл ... НО ... на некоторых системах работает (я так понимаю BSD 4.11, debian старый и новый, лично не проверял. Было много в гугле на опеннете и ещё на некоторых форумах ), а под BSD 5.5 и 6.1 пришлось добавлять
    Код (Text):
    1. if (ioctl(fd,FIONREAD,&i)) == -1)
    2. {
    3.    fstat(fd,&mystat);
    4.    if (mystat.st_mode & S_IFREG == 0)
    5.       return (-1);
    6.    i=mystat.st_blksize;
    7. }
    P.S.
    гдето увидел что какаято фигня под SYTEM V происходит (или наоборот не происходит, но помоему бред) с FIONREAD в какойто книжки по UNIX в гугле, теперь не могу ей найти
    P.P.S
    всё это из FROX 0.17.18 файл sstr_io.c
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    dag
    Так это для того используется, чтобы отличить файл от сокета? Тогда, кроме проверки -1 желательно проверять ещё и errno на предмет EBADF. Причём должен существовать более документированный способ отличить сокет от файла.
     
  5. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Тут не только проверка на сокет (грубо говоря автор FROXа даже и не думал проверять socket или регулярный файл) , тут ещё в i попадает количество доступных уже данных и это используется далее в коде ... вобщем суть не в этом (более красиво былобы сделать сначала fstat, а потом ioctl ) ворпос в том что на каких-то системах работает и не патченый код (1), тоесть гдето в i попадает непонятное число (предположительно st_blksize) но гдето (точно на BSD 5.5 и 6.1 ) это не прокатывает вот и вопрос как такое возможно ????