LINUX.ORG.RU

Сообщения unsigned

 

Как заблокироваться на чтении канала?

syslog пишет сообщения в пайп, мой демон их оттуда читает обычными fgets и т. п. Все хорошо, пока не остановится syslog - тогда в пайпе появляется бесконечный EOF, и демон занимает весь CPU.

Можно ли уснуть так, чтобы проснуться только при поступлении реальных данных (при перезапуске syslog)?

unsigned
()

Как выбрать endianness?

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

За Big endian то, что это сетевой порядок байт, вроде как он считается платформонезависимым.

За Little endian то, что он чаще встречается, и накладных расходов на перекодирование не будет (скорость важна).

Что правильнее?

unsigned
()

[Fedora] Как собрать кросскомпилятор?

Смотрю на gcc.spec из Fedora 15 - похоже, что кросскомпилятор из него собрать нельзя. Это особенно удивляет, потому что для binutils такая возможность есть - target задается макросом. А для gcc - нет.

Так как это предполагается делать средствами RPM?

 

unsigned
()

[bash] Как tee встроить в скрипт?

Запускаю свой скрипт так:

./install.sh 2>&1 | tee ~/install.log
Нужно то же самое, но прозрачно для пользователя, чтобы скрипт запускался просто как ./install.sh

 

unsigned
()

[gentoo] Не заводится nouveau

Не могу поднять иксы. Карточка GeForce 8400GS, Gentoo amd64, linux-2.6.37-gentoo-r4, VIDEO_CARDS=«nouveau», xf86-video-nouveau-0.0.16_pre20101130. На X -configure получаю

[   709.548] (EE) [drm] No DRICreatePCIBusID symbol
[   709.548] Number of created screens does not match number of detected devices.
  Configuration failed.
С простейшим xorg.conf(загружаю glx и dri, Device=«nouveau», Mode 0666):
[   912.878] drmOpenDevice: node name is /dev/dri/card0
[   912.883] drmOpenByBusid: Searching for BusID pci:0000:01:00.0
[   912.883] drmOpenDevice: node name is /dev/dri/card0
[   912.886] drmOpenByBusid: drmOpenMinor returns -1
[   912.886] drmOpenDevice: node name is /dev/dri/card1
[   912.890] drmOpenByBusid: drmOpenMinor returns -1
...
[   912.995] drmOpenDevice: node name is /dev/dri/card14
[   912.999] drmOpenDevice: node name is /dev/dri/card15
[   913.002] (EE) [drm] failed to open device
[   913.002] (EE) No devices detected.
# lsmod
Module                  Size  Used by
nouveau               538876  0 
ttm                    49932  1 nouveau
drm_kms_helper         26185  1 nouveau
drm                   172525  3 nouveau,ttm,drm_kms_helper
agpgart                27913  2 ttm,drm
i2c_algo_bit            4823  1 nouveau
nvidiafb               36825  0
vgastate                8818  1 nvidiafb
Ставил по Gentoo Wiki, что не так?

 

unsigned
()

8-битный хэш для строки

Есть строка из 3-8 латинских строчных букв, хочу получить для нее 8-битный хэш для создания таблицы.
Все допустимые строки заранее известны, их примерно 40 (потом может добавиться десяток новых строк, но тогда я могу и функцию сменить).
В идеале, обойтись бы без коллизий.
Как подобрать функцию? Где об этом почитать?

unsigned
()

[C] Неупакованные структуры в ELF

Смотрю в elf.h - уйма структур, описывающих заголовок и секции. Ни одна из них не упакована, поэтому теоретически там могут быть дыры, но тогда бинарники получались бы у каждого свои, ни с чем не совместимые.
Так что дыр наверняка нет. Чем это гарантируется? Почему не указали явно упаковку?

 

unsigned
()

[C] Бесполезные типы данных?

Поясните, зачем нужны типы short и long?

Тип int я использую, если мне просто нужна целая переменная, неважно, какой ширины. int - самый эффективный на любой платформе, это удобно. А что известно про long int? Только гарантированная ширина 32 бита. Но если мне нужно 32 бита, я возьму int32_t, это логично, и я не получу сюрпризов на 64-битной машине То же самое относится и к short int, и к long double.

В общем, не вижу смысла в типах, для которых не описано однозначно множество допустимых значений (int - исключение, как уже сказал).

Есть ситуации, когда они всё-таки полезны?

 

unsigned
()

[C] h-файл для расширений компиляторов

Есть ли готовый заголовочный файл, оборачивающий макросами расширения C основных компиляторов? Наподобие

#if __GNUC__ + 0 >= 2 && __GNUC_MINOR__ + 0 >= 96
#define likely(x)    __builtin_expect(!!(x), 1)
#define malloc_like  __attribute__((malloc))
#else
#define likely(x)    (x)
#define malloc_like
#endif
И так для разных расширений и компиляторов. И чтобы файл можно было поправить и к себе в проект утащить.

В sys/cdefs.h есть подобное, но мало, и только gcc, и GPL.

 

unsigned
()

[C] Функцию превратить в макрос

Синтаксическая задача. Есть функция, упрощенно:

static inline void *mm_get_chunk(void **pool)
{
  void *head = *pool;
  *pool = next(*pool);
  return head;
}
Ее нужно превратить в макрос, сохранив способ использования. Возможно ли?

Проблема в том, что нужно правостороннее выражение, но нужна и временная переменная.

 

unsigned
()

[C] строки dlerror/strerror

const char *s = dlerror();
big_function();
puts(s);

Есть ли гарантия, что по адресу, который я запомнил, всегда будет одна и та же строка? Т. е. нет ли там внутри какого-нибудь буфера (я про гарантии стандартов).

Ну и тот же вопрос относительно strerror(errno).

 

unsigned
()

[vim] Копирование в командную строку

Можно ли скопировать выделенный текст в командную строку vim?

Например, если искать текст во всех файлах, приходится набирать его после :grep, должен быть способ проще.

 

unsigned
()

[C] Полиморфные тормоза

Есть абстрактный тип:

typedef int (*FruitID)(Fruit);
 
typedef struct _Fruit {
    int type;
    FruitID id;
} *Fruit;
и его реализация:
typedef struct _Apple {
    struct _Fruit base;
} *Apple;
 
int apple_id(Apple a)
{
    return 1;
}
 
Apple apple_new(void)
{
    Apple a = (Apple)malloc(sizeof(struct _Apple));
    a->base.type = 1;
    a->base.id = (FruitID)apple_id;
    return a;
}
Теперь добираюсь до поля объекта абстрактного типа двумя методами - «честный» полиморфизм и кондовый switch:
int fruit_id_virt(Fruit f)
{
    return f->id(f);
}
 
int fruit_id_nonvirt(Fruit f)
{
    switch(f->type) {
        case 1:
            return apple_id((Apple)f);
        case 2:
            return orange_id((Orange)f);
    }
    return 0;
}
и провожу замеры времени:
Fruit a = (Fruit)apple_new();
Fruit o = (Fruit)orange_new();
for(i = 0; i != 0xFFFFFFF; ++i)
#ifdef VIRT
  sum += fruit_id_virt(a) + fruit_id_virt(o);
#else
  sum += fruit_id_nonvirt(a) + fruit_id_nonvirt(o);
#endif
с помощью time(1). Грубо, конечно, но результат очевиден:

с fruit_id_virt: 0m9.644s

c fruit_id_nonvirt: 0m4.849s

ЧЯДНТ, отчего такое падение скорости? Как вызов по указателю может быть медленнее цепочки сравнений? Я уже хотел немного избавиться от if/switch в своем коде (как-то и эстетичнее оно), а тут такое...

 

unsigned
()

[autotools] Нужен ли libtool?

Пишу библиотеку, использую automake. Вместе с ним настоятельно рекомендуют использовать libtool, но мне эта вещь совсем не понравилась. Есть ли причины пользоваться ей в 2010 году?

Кажется, все, что дает libtool - это поддержка всех существующих платформ, из которых большинство уже умерло, а оставшиеся пришли к более-менее единому стандарту. По крайней мере, на linux и *BSD сборка делается одной и той же командой.

А если отказаться от libtool, то как быть с automake? Достаточно ли добавить в Makefile.am

libmx.so       : expr.c var.c func.c module.c list.c
    $(CC) -I.. -fpic -shared -o $@ $^
? Это кроссплатформенно (для живых систем)?

(Вопрос только по autotools, предполагается, что они нужны ))

 

unsigned
()

[C] конструктор в архиве

Имеется архив с функцией-конструктором, вызываемой перед main.

void init() __attribute__((constructor));
Линкую с основной программой - функция не вызывается (и ее нет в бинарнике).

Если вызвать ее явно, то вызовется также и перед main.

Если линковать с объектным файлом, то тоже все нормально.

Как вытащить init из архива без явного вызова?

 

unsigned
()

[C] Нулевые переменные

Глобальные переменные по умолчанию инициализируются нулем, т. е. объявления

int i;
int j = 0;
равносильны. Почему тогда gcc генерирует разный код для них?
    .bss
j:
    .zero 4
.comm i, 4, 4
В описании .comm ничего не сказано об инициализации нулем.

 

unsigned
()

Удаленный запуск программы

На сервере есть программка, которая должна запускаться по запросу клиента, делать нужное действие и сразу завершаться. Обмена данными на этом уровне можно избежать. Как лучше реализовать такое, не писать же собственный сервер?

unsigned
()

RSS подписка на новые темы