Previous Entry Редактировать запись Редактировать метки В избранное Поделиться Отслеживать Next Entry
А вот что такое ШОК
unix
[info]tobotras
http://avnik.livejournal.com/29887.html

Комментарий из определения FILE в stdio.h:

   char	_file;		/* should be short */


Слов нет, одни эмоции.

Бесподобно!

Отчасти они, вобщем-то, правы - зачем процессу больше 252 fd? Если так дофига файлов открыть надо - значит, софтина кривая, давно пора хранилище в БД перенесть.

А всякую почту держать на солярисе - моветон :-)

Ну, процесс может быть сервером и хавать много сокетов...

(Анонимно)

2006-02-07 22:14 (местное) Удалить Spam Скрыть Заморозить Track This

(85.140.252.25)

сервера на stdio никто в здравом уме не пишет // maxcom

А что, моя дурак, и сокеты AF_INET тоже через fd работают?

Не хотелось бы тебя расстраивать... :)

Дык этта... Сокет-то получается другого типа, нежели файл, да? Тип-то по-другому описан?

Впрочем, я в сях - как свинья в апельсинах :-)

Ну, глубоко в дебрях ядра он слегка другого типа, да. Но для пользовательского процесса интерфейс к нему тот же -- число-файлдескриптор.

(Как в сях, так и в других языках, это свойство Юникса.)

Для меня большим шоком было то, что проблема с длинным путем в locate/find до сих пор не решена (с 1994 года никто практически не трогал код).

А в чем она заключается? В ограниченном и фиксированном размере буфера под командную строчку exec'а?

http://archive.linuxfromscratch.org/lfs-museum/4.1/LFS-BOOK-4.1-HTML/chapter06/findutils.html

There is a bug in locate.c of Findutils that causes a segmentation fault to occur on very long path names. The problem is caused by the get_short() function calculating negative numbers incorrectly. This patch corrects this bug.

Как оказалось и в этот, и в другие разы, патчи проблему не лечат. До сих пор неизвестно, где ошибка.

А чего -- критично?

[info]poige

2006-02-11 10:46 (местное) Удалить Spam Скрыть Заморозить Track This

Финансируйте. ;-)

Меня в свое время убила имплементация STDIO в одной из версий libc для макинтоша. там был FILE files[256], хэндлер был индексом там, а open - wrapper-ом поверх fopen

это в каком солярисе?
unsigned char _file; /* UNIX System file descriptor */
в stdio_impl.h в 5.7..

Я поглядел в исходниках opensolaris.

Один черт, больше 255 не лезет :)

это известная штука, и этому комментарию в stdio.h не меньше 20 лет. более того, этот char обычно трактуется как signed, и дескрипторов тогда вообще не больше 128.

можно в принципе написать свой fopen(), который будет отдавать заранее зарезервированный дескриптор вместо полученного >256. понятно, что если одновременно используется больше 256 дескрипторов, то после каждого такого fopen() придётся делать fclose().

иначе -- только open()

Дык, что делать и кто виноват, понятно. Надо ж было допереть :)

Вообще -- не понимаю, на кой черт столько лет тащить за собой явный баг :(

это называется brain damage.
ну точно:
/* @(#) stdio.h 1.2 86/10/07 SMI; from UCB 1.4 06/30/83 */

# ifndef FILE
#define BUFSIZ  1024
#define _SBFSIZ 8
extern struct _iobuf {
       int    _cnt;
       unsigned char *_ptr;
       unsigned char *_base;
       int    _bufsiz;
       short  _flag;
       char   _file;          /* should be short */
} _iob[];

что-то мне говорит, что оно из seventh edition идёт.)


Групповое действие над комментариями:
Картинка пользователя

Вы читаете свой журнал