LINUX.ORG.RU

Сообщения jek_

 

Как в X11 сделать окно с текстом и кликабельным URL?

Т.е. хочется показать текстовое окошочко и ссылку. И чтобы при клике на ссылку открывался броузер.

GTK/Qt не подходят, нужно на голом Xlib.

Help!

jek_ ()

Манглирование C++ символов: _ZN14QWaitConditionC1Ev

В одной библиотеке торчат ссылки на Qt-функции вот такого вида: _ZN14QWaitConditionC1Ev. Мне нужно руками собрать такую библиотеку Qt. Собираю. В собранной библиотеке таких символов нет, а есть такие:

__14QWaitCondition
wait__14QWaitCondition
wait__14QWaitConditionUl
wait__14QWaitConditionP6QMutexUl
__tf14QWaitCondition

И она, конечно, не линкуется с моей библиотекой. Вопрос такой: очевидно, что манглирование зависит от компилятора. Вот что заставляет gcc генерить префиксы вида _ZN14 и суффиксы C1Ev? Какиме именно ключи?

jek_ ()

Сделать из C++ библиотеки RPC-модуль

Хочется такого вот изврата.

Есть некая достаточно сложная C++ библиотека. Есть уже готовое приложение, которое её использует. Хочется (в идеале не меняя ни библиотеку, ни приложение) утащить библиотеку на удалённую машину, а приложение оставить на другой машине, так, чтобы работая, это приложение использовала библиотеку на той, удалённой машине.

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

Если есть куча С++ заголовков, нужно иметь некоторый тул, который их обходит и генерит правильные x-файлы для rpcgen, или что-то в таком духе. Есть ли в природе подобные штуки?

jek_ ()

C++: Использование boost/stl для работы с двумерными векторами

Нужно сделать приблизительно такое:

for(Matrix::iterator row = matrix.begin(); row != matrix.end(); row++)
  for(Matrix::Row::iterator col = row->begin(); col != row->end(); col++)
    myStream << *col;

Развесисто и непереиспользуемо (нужно всегда копировать эти строки,
если хочется сделать что-нибудь другое с элементами матрицы.

Сильно подозреваю, что где-то рядом кроется изящный приём типа
boost::bind, позволивший бы сделать это одним махом, без итераторов
и циклов. 

Например, такое приходит в голову:

std::for_each(
  matrix.begin(), 
  matrix.end(),

  boost::bind(
    &std::for_each,
    _1.begin(),
    _2.end,
    some_operator
  )
);

Ясно, что работать оно не будет, ибо в boost::arg<> нет никаких
begin() и end(). 

Или такое:

std::for_each(
  matrix.begin(), 
  matrix.end(),

  boost::bind(
    &std::for_each,
    boost::bind(&Matrix::Row::begin, _1),
    boost::bind(&Matrix::Row::end, _2),
    some_operator
  )
);

Тоже не годится, потому что два промежуточных параметра внешнего
bind должны быть определены объектом типа boost::arg<>.

Вот что бы такое придумать, чтобы было столь же красиво и работало? :)
jek_ ()

Привилегированные инструкции в user mode

Такая проблема: нужно выполнить некоторые отладочные действия для данного процесса, доступные только в kernel mode (cpu privilege level 0). А именно, хочется выполнить инструкции x86 RDMSR/WRMSR для установки отладочных флагов, но именно в user mode, в моей программе.

Как это сделать? Отладочные регистры dr0-dr7 можно выставить с помощью вызова ptrace, а вот RDMSR/WRMSR? Как?

Заранее спасибо за любую помощь!

jek_ ()

Удивительная проблема: в работающем треде вдруг меняется EIP... Help!!

Возникла удивительная проблема: в одном из тредов работающей программы вдруг, совершенно на ровном месте, меняется EIP на мусор.

Ситуация такая: запускается служебный тред, основной тред его ждёт на событии (мутекс), при этом ничего больше не делается. Тот, запущенный, начинает свою деятельность - просто обсчёт данных, при этом даже вызовов процедур не происходит. Изредка (!) - то есть от запуска к запуску - внезапно в нём происходит SIGSEGV. Дамп показывает, что всегда, при каждом развале, у этого развалившегося треда один и тот же стек, одни и те же регистры. В EIP находится мусор - число 0x9C.

Удивительно то, что на этот тред извне ничто не влияет, его не приостанавливают, ptrace не делают, и никаких setjmp/longjmp в нём не делается. При этом того числа - 0x9C в его стеке НЕТ, то есть переход в неизвестно куда по инструкции ret исключается, т.е. стек не едет.

Такое впечатление, что системный шедулер неправильно восстанавливает контекст треда. Но почему всегда в один и тот же момент, в одном и том же месте?!!

Кто-нибудь сталкивался с такой мистикой? Поможите... :_(

Система:

> uname -a
Linux z-suse92 2.6.8-24-default #1 Wed Oct 6 09:16:23 UTC 2004 i686 athlon i386 GNU/Linux

> cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 10
model name : AMD Athlon(tm) XP 2500+
stepping : 0
cpu MHz : 1826.970
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 mmx fxsr sse pni syscall mmxext 3dnowext 3dnow
bogomips : 3612.67

jek_ ()

Как определить «возраст» файла до секунд командой shell?

Хочется элегантно. Научите, плиз...

Нужно одной командой понять, что файл старее скажем 24 часов,
то есть вот что-то такое:

if [ File MyFile.txt is older than 24 hours ]; then
  bla-bla
fi

Разгребать вывод ls и делать разницу между date что-то не хочется...

Спасибо!
jek_ ()

Пакеты для создания инсталляторов

Какие есть в природе для Linux?

Я знаю InstallShield, InstallAnywhere - эти Java-based, делают Swing-based интерфейс.

Есть ещё BitRock (http://www.bitrock.com/products_installbuilder_overview.html) - делает нативные инсталляторы.

Всё это коммерческое, без исходников.

А что ещё есть?

jek_ ()

Хочется тулзу на bash'e, отслеживающую memory size внешней программы

На сервере крутится программа (несколько часов или даже дней), в какой-то момент времени начинающая активно сжирать память. Хочется этот момент отследить (ну то есть vm size превысило пороговое значение), и, как только он наступил, сделать некое действие - ну создать файл /tmp/flag.memory.increasing, к примеру.

Как бы такое сделать?
Заранее спасибо.

jek_ ()

Способ избавиться от backward-несовместимости в glibc... Кошерно ль?

Имеется некая приблуда - компилятор+линкер. Она должна работать на всех пользовательских системах, рожая там исполняемые ELF-файлы и ELF shared libraries. В число требований входит, чтобы её продукты работали на всех линуксах.

Проблема в том, что её продукты используют некоторые функции из glibc, libpthread, etc. Обычно при линковке на endudser системах символы из glibc версионируются той версией, которая имеется на пользовательской системе. Скажем, foo@GLIBC_2.3.2 - запросто на SuSE 9.2. Так что эта программа не будет работать на SuSE 8.2, где стоит glibc 2.2.5, поскольку там нет foo@GLIBC_2.3.2, но есть foo@GLIBC_2.2.5.

Для обхождения сей неприятности предлагается собрать gcc-ом маленькую библиотечку, примерно такого вида:

void printf() {}
void strlen() {}
void _exit() {}
....
и т.д.

На enduser-машине линковаться к этой библиотечке. Таким образом слинкованная прилада при запуске засосёт нужный символ из /lib/libc.so.6 на _любой_ системе.

Для повышения надёжности сей схемы можно при сборке этой маленькой библиотечки-посредника заиспользовать version-скрипт со старыми версиями символов. Можно их набрать из сырцов glibc от того же SuSE8.2. Таким образом прилада всегда будет гарантированно работать на любой системе выше чем SuSE8.2.

Вопрос: насколько всё это "политкорректно", кошерно, юних-вей и т.д.?

Какие могут быть проблемы?

Спасибо за внимание...

jek_ ()

Способ отслеживать только хвост большого лога?

Проблема такая. Есть программулька, выводящая в stdout свой лог. Лог очень насыщенный, а свободного места на диске мало - если логировать в файл, кончится очень быстро, это не подходит. Поэтому хочется придумать способ, чтобы в файле на диске был постоянно только самый хвост лога, а остальное бы выбрасывалось в никуда.

Или, что тоже подходяще, как бы можно было бы выводить лог в /dev/null, но по желанию, __не обрывая выполнение прилады__, перенаправить её лог в нужный файл (как бы забрать сачком кусочек лога), а потом опять перанаправить его в /dev/null?

Оч. нужно, помогите!

Заранее большое спасибо!

jek_ ()

Зашедулить reboot системы...

Нужно :) я вставил в crontab под root'ом следующую строку:

30 21 * * *      /sbin/reboot

Типа, ежедневно перебучиваться в 21:30. К моему удивлению, сегодня
в /var/messages обнаружилось:

Sep  4 21:30:00 darkstar /USR/SBIN/CRON[3478]: (root) CMD (/sbin/reboot)
Sep  4 21:30:00 darkstar init: Switching to runlevel: 6
Sep  4 21:30:06 darkstar nmbd[617]: [2005/09/04 21:30:06, 0] nmbd/nmbd.c:sig_term(63)
Sep  4 21:30:06 darkstar nmbd[617]:   Got SIGTERM: going down...
Sep  4 21:30:06 darkstar sshd[526]: Received signal 15; terminating.
Sep  4 21:30:06 darkstar kernel: Kernel logging (proc) stopped.
Sep  4 21:30:06 darkstar kernel: Kernel log daemon terminating.
Sep  4 21:30:08 darkstar exiting on signal 15
Sep  4 22:29:01 darkstar syslogd 1.4.1: restart.
Sep  4 22:29:06 darkstar kernel: klogd 1.4.1, log source = /proc/kmsg started.

Удивляет то, что, хотя перезагрузка случилась как положено, в 21:30, 
рестарт системы начался только в 22:29! А это уже никуда не годится.
Самое странное, что такая картина - все выходные. Если я сейчас 
зашедулю перезагрузку на 12:20, она случится и машина загрузится
тут же. Почему же вечером куда-то девается целый час?!

Просто ума не приложу... Кто сталкивался с такой бедой, поможите, плиз...

Что можно сделать?

jek_ ()

Процесс убивается ядром по OOM! Что делать?

Процесс, активно жрущий память вдруг умирает с месседжом Killed.
В /var/log/messages появляется запись: process killed, oom.

А собственно вопрос: как же заранее узнать, когда памяти не хватит?
Ведь этот же не дело: был процесс, работал, выделял память, и вдруг беспричинно умирает!

Что тут можно сделать?

jek_ ()

Виснет fork(), помогите...

Вот такая проблема: на системе с LinuxThreads один из тредов делает
fork(). В это время другой тред, пользуясь известным pid-ом этого треда,
делает связку

ptrace(PTRACE_ATTACH, pid, NULL, NULL)
waitpid(pid, status, __WALL)
ptrace(PTRACE_GETREGS, pid, NIL, &regs)
ptrace(PTRACE_DETACH, pid, NULL, NULL)

Приостановленный тред продолжает работу, но виснет в fork()! В GDB 
видно, что тред выполнил int 0x80 - системный вызов произошел. Дальше
ничего нет - fork() повис где-то, видимо, в ядре.

Как же такое может быть?... Что же делать? :(
jek_ ()

Дефолтный размер шрифта, проперть Xft.dpi

Проблема в том, что в некоторых приложениях шрифт слишком большой. Сие имеет место на системах RedHat Enterprise 3 и 4. На 4 она полечилась удалением из /etc/X11/Xresources строчки Xft.dpi: 96. Все, шрифты стали маленькими. Однако, этот трюк не работает в RHEL 3!

Я пробовал менять/убирать DisplaySize из XF86Config (секция Monitor), но это не помогает :(

Куда копать? Что еще попробовать?

Заранее спасибо!

jek_ ()

Доступная физическая память....

Ситуация такая: есть Linux-машина с 2 GB RAM. В какой-то момент
времени в работающей программе вызов sysconf(_SC_AVPHYS_PAGES)
возвращает количество страниц, общий размер которых составляет около
30 MB.

На основании этих данный делается попытка резервировать регион адресного пространства так: 

mmap(NULL, 
     size, 
     PROT_READ | PROT_WRITE | PROT_EXEC,
     MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS, 
     -1, 
     0)

где size == 262144 (256 килобайт).

Но этот вызов иногда проваливается! Очевидно (поправьте меня, если я
ошибаюсь), фрагментация памяти такова, что система не может выделить
последовательность страниц такой длины... 

А вопрос такой: каким же образом можно понять, что в системе есть 
достаточное количество свободной физической памяти, которую можно
резервировать (как?), не опасаясь ошибки?

Или это вообще невозможно? Может быть, есть какой-то приближённый
метод?

Заранее спасибо!
jek_ ()

Не понимаю с mmap..

Только не пинайте, плиз... :)

Вот есть такая программулина:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/mman.h>
size_t total = 0;
void *reserve(size_t size) {
  void *mem = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
                               MAP_PRIVATE /*| MAP_NORESERVE*/ | MAP_ANONYMOUS,
                   -1, 0);

  if(mem == MAP_FAILED) {
      printf("Cannot reserve memory (%d KB): %s\n", size / 1024, strerror(errno));
      printf("Reserved so far: %d KB\n", total);
      return NULL;
  }
  total += size / 1024;
  printf("Reserved %d KB (total %d KB)\n", size / 1024, total);
  return mem;
}

#define M (1024*1024)

int main() {
  void *mem = reserve(256 * M);
  if (!mem)
     return 0;
  while(reserve(64 * M))
     ;
  return 0;
}

Она последовательно, блоками по 64мб резервирует пространство ровно в
2 гб (я проверял на машинах с 2 гб. и 512 мб. памяти). Таково значение
переменной total в конце работы - а конец наступает, когда mmap
обламывается с ошибкой ENOMEM.

Я не понимаю, почему резервнуть таким образом можно только 2 гб...

Объясните, пожалуйста!
Заранее спасибо.
jek_ ()

Samba: file permissions

Вопрос такой: можно ли как-нибудь научить самбу сохранять пермиссии
файлов при работе в линуксовой сети? Т.е. у меня две linux машины
общаются между собой по smbfs, но пермиссии все херятся - какие файлы
запускаемые, какие нет - вся инфа пропает... Можно ли это обойти?

В мане ничего не нашёл :( 

Заранее спасибо.
jek_ ()

Глюки на форуме

Не так давно замечена следующая беда: если зайти на форум (Development для определенности) и потом ткнуть на ссылку на предыдущую страницу (где располагаются более старые сообщения), то эта страница не покажется. Вместо нее будет виден кусок последней страницы, т.е. current страницы, с самыми последними сообщениями. Глюк-с...

Никаких своих настроек у меня нет, все используется стандартное. "Вход" на сайт я тоже не делаю.

jek_ ()

Как узнать начало пользовательского стека процесса?

Вот вызвалась функция main, что-то делает... Как бы узнать для данного процесса, откуда растет стек? Если, к примеру, взять адрес одного из аргументов, передаваемых в __libc_start_main, гарантированно ли стек начинается с начала страницы, которой принадлежит этот адрес?

jek_ ()

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