Как в X11 сделать окно с текстом и кликабельным URL?
Т.е. хочется показать текстовое окошочко и ссылку. И чтобы при клике на ссылку открывался броузер.
GTK/Qt не подходят, нужно на голом Xlib.
Help!
Т.е. хочется показать текстовое окошочко и ссылку. И чтобы при клике на ссылку открывался броузер.
GTK/Qt не подходят, нужно на голом Xlib.
Help!
В одной библиотеке торчат ссылки на Qt-функции вот такого вида: _ZN14QWaitConditionC1Ev. Мне нужно руками собрать такую библиотеку Qt. Собираю. В собранной библиотеке таких символов нет, а есть такие:
__14QWaitCondition
wait__14QWaitCondition
wait__14QWaitConditionUl
wait__14QWaitConditionP6QMutexUl
__tf14QWaitCondition
И она, конечно, не линкуется с моей библиотекой. Вопрос такой: очевидно, что манглирование зависит от компилятора. Вот что заставляет gcc генерить префиксы вида _ZN14 и суффиксы C1Ev? Какиме именно ключи?
Хочется такого вот изврата.
Есть некая достаточно сложная C++ библиотека. Есть уже готовое приложение, которое её использует. Хочется (в идеале не меняя ни библиотеку, ни приложение) утащить библиотеку на удалённую машину, а приложение оставить на другой машине, так, чтобы работая, это приложение использовала библиотеку на той, удалённой машине.
В принципе, нет ничего принципиально невозможного в том, чтобы нагенерить RPC-заглушек для используемых библиотечных функций. Но на практике?..
Если есть куча С++ заголовков, нужно иметь некоторый тул, который их обходит и генерит правильные x-файлы для rpcgen, или что-то в таком духе. Есть ли в природе подобные штуки?
Нужно сделать приблизительно такое: 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<>. Вот что бы такое придумать, чтобы было столь же красиво и работало? :)
Такая проблема: нужно выполнить некоторые отладочные действия для данного процесса, доступные только в kernel mode (cpu privilege level 0). А именно, хочется выполнить инструкции x86 RDMSR/WRMSR для установки отладочных флагов, но именно в user mode, в моей программе.
Как это сделать? Отладочные регистры dr0-dr7 можно выставить с помощью вызова ptrace, а вот RDMSR/WRMSR? Как?
Заранее спасибо за любую помощь!
Возникла удивительная проблема: в одном из тредов работающей программы вдруг, совершенно на ровном месте, меняется 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
Хочется элегантно. Научите, плиз... Нужно одной командой понять, что файл старее скажем 24 часов, то есть вот что-то такое: if [ File MyFile.txt is older than 24 hours ]; then bla-bla fi Разгребать вывод ls и делать разницу между date что-то не хочется... Спасибо!
Какие есть в природе для Linux?
Я знаю InstallShield, InstallAnywhere - эти Java-based, делают Swing-based интерфейс.
Есть ещё BitRock (http://www.bitrock.com/products_installbuilder_overview.html) - делает нативные инсталляторы.
Всё это коммерческое, без исходников.
А что ещё есть?
На сервере крутится программа (несколько часов или даже дней), в какой-то момент времени начинающая активно сжирать память. Хочется этот момент отследить (ну то есть vm size превысило пороговое значение), и, как только он наступил, сделать некое действие - ну создать файл /tmp/flag.memory.increasing, к примеру.
Как бы такое сделать?
Заранее спасибо.
Имеется некая приблуда - компилятор+линкер. Она должна работать на всех пользовательских системах, рожая там исполняемые 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.
Вопрос: насколько всё это "политкорректно", кошерно, юних-вей и т.д.?
Какие могут быть проблемы?
Спасибо за внимание...
Проблема такая. Есть программулька, выводящая в stdout свой лог. Лог очень насыщенный, а свободного места на диске мало - если логировать в файл, кончится очень быстро, это не подходит. Поэтому хочется придумать способ, чтобы в файле на диске был постоянно только самый хвост лога, а остальное бы выбрасывалось в никуда.
Или, что тоже подходяще, как бы можно было бы выводить лог в /dev/null, но по желанию, __не обрывая выполнение прилады__, перенаправить её лог в нужный файл (как бы забрать сачком кусочек лога), а потом опять перанаправить его в /dev/null?
Оч. нужно, помогите!
Заранее большое спасибо!
Нужно :) я вставил в 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, она случится и машина загрузится тут же. Почему же вечером куда-то девается целый час?! Просто ума не приложу... Кто сталкивался с такой бедой, поможите, плиз... Что можно сделать?
Процесс, активно жрущий память вдруг умирает с месседжом Killed.
В /var/log/messages появляется запись: process killed, oom.
А собственно вопрос: как же заранее узнать, когда памяти не хватит?
Ведь этот же не дело: был процесс, работал, выделял память, и вдруг беспричинно умирает!
Что тут можно сделать?
Вот такая проблема: на системе с LinuxThreads один из тредов делает fork(). В это время другой тред, пользуясь известным pid-ом этого треда, делает связку ptrace(PTRACE_ATTACH, pid, NULL, NULL) waitpid(pid, status, __WALL) ptrace(PTRACE_GETREGS, pid, NIL, ®s) ptrace(PTRACE_DETACH, pid, NULL, NULL) Приостановленный тред продолжает работу, но виснет в fork()! В GDB видно, что тред выполнил int 0x80 - системный вызов произошел. Дальше ничего нет - fork() повис где-то, видимо, в ядре. Как же такое может быть?... Что же делать? :(
Проблема в том, что в некоторых приложениях шрифт слишком большой. Сие имеет место на системах RedHat Enterprise 3 и 4. На 4 она полечилась удалением из /etc/X11/Xresources строчки Xft.dpi: 96. Все, шрифты стали маленькими. Однако, этот трюк не работает в RHEL 3!
Я пробовал менять/убирать DisplaySize из XF86Config (секция Monitor), но это не помогает :(
Куда копать? Что еще попробовать?
Заранее спасибо!
Ситуация такая: есть 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 килобайт). Но этот вызов иногда проваливается! Очевидно (поправьте меня, если я ошибаюсь), фрагментация памяти такова, что система не может выделить последовательность страниц такой длины... А вопрос такой: каким же образом можно понять, что в системе есть достаточное количество свободной физической памяти, которую можно резервировать (как?), не опасаясь ошибки? Или это вообще невозможно? Может быть, есть какой-то приближённый метод? Заранее спасибо!
Только не пинайте, плиз... :) Вот есть такая программулина: #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 гб... Объясните, пожалуйста! Заранее спасибо.
Вопрос такой: можно ли как-нибудь научить самбу сохранять пермиссии файлов при работе в линуксовой сети? Т.е. у меня две linux машины общаются между собой по smbfs, но пермиссии все херятся - какие файлы запускаемые, какие нет - вся инфа пропает... Можно ли это обойти? В мане ничего не нашёл :( Заранее спасибо.
Не так давно замечена следующая беда: если зайти на форум (Development для определенности) и потом ткнуть на ссылку на предыдущую страницу (где располагаются более старые сообщения), то эта страница не покажется. Вместо нее будет виден кусок последней страницы, т.е. current страницы, с самыми последними сообщениями. Глюк-с...
Никаких своих настроек у меня нет, все используется стандартное. "Вход" на сайт я тоже не делаю.
Вот вызвалась функция main, что-то делает... Как бы узнать для данного процесса, откуда растет стек? Если, к примеру, взять адрес одного из аргументов, передаваемых в __libc_start_main, гарантированно ли стек начинается с начала страницы, которой принадлежит этот адрес?
следующие → |