Можно ли узнать handle библиотеки, загруженной dlopen(), внутри самой этой библиотеки?
Можно ли это сделать во время загрузки библиотеки, т.е. в функции dlopen()?
Можно ли это сделать во время загрузки библиотеки, т.е. в функции dlopen()?
У меня такая задача: есть тред (pthread), который должен ожидать чего-то в функции select. Родительский тред ждет в это время некоего семафора. Когда семафор сигналит, он должнен убить дочерний тред, ожидающий в select. Я так понимаю, нужно послать ему сигнал. Вопрос: как это красиво сделать, какой сигнал посылать? Обязательно ли пользоваться функцией pselect, или можно обойтись и select? Если можно, кто-нибудь, набросайте общую схемку. Буду очень признателен.
Вот такая прога не работает. Здесь оба потока создаются нормально, один начинает писать в свой файл, сообщая каждую секунду write OK. Однако второй поток вообще ничего не сообщает, вызов select подвисает. Подскажите, плиз, в чем тут дело. int mypipe[2]; void * start1(void*p) { int i; char buf[1]; int err; for(i=0;i<10;++i) { sleep(1); buf[0] = (char)i; if(write(mypipe[1], buf, 1) < 0) { perror("thread1: write error:"); break; } } return NULL; } void * start2(void*p) { int i; int err; char buf[1]; fd_set s; for(i = 0; i < 15; ++i) { FD_ZERO(&s); FD_SET(mypipe[0], &s); if((err=select(1, &s, NULL, NULL, NULL)) < 0) { perror("thread2: file descriptors select error:"); break; } else if(err == 0) printf("select timeout\n"); if(read(mypipe[0], buf, 1) < 0) { perror("thread2: read error:"); break; } else printf("data received: %d\n", buf[0]); } return NULL; } int main() { pthread_t th1, th2; int err; if((err = pipe(mypipe)) != 0) { perror("error creating pipe: "); return 1; } pthread_create(&th2, NULL, start2, NULL); pthread_create(&th1, NULL, start1, NULL); return 0; }
Вот такая прога не работает. Здесь оба потока создаются нормально, один начинает писать в свой файл, сообщая каждую секунду write OK. Однако второй поток вообще ничего не сообщает, вызов select подвисает. Подскажите, плиз, в чем тут дело.
int mypipe[2];
void * start1(void*p) { int i; char buf[1]; int err; for(i=0;i<10;++i) { sleep(1); buf[0] = (char)i; if(write(mypipe[1], buf, 1) < 0) { perror("thread1: write error:"); break; } } return NULL; }
void * start2(void*p) { int i; int err; char buf[1]; fd_set s; for(i = 0; i < 15; ++i) { FD_ZERO(&s); FD_SET(mypipe[0], &s); if((err=select(1, &s, NULL, NULL, NULL)) < 0) { perror("thread2: file descriptors select error:"); break; } else if(err == 0) printf("select timeout\n"); if(read(mypipe[0], buf, 1) < 0) { perror("thread2: read error:"); break; } else printf("data received: %d\n", buf[0]); } return NULL; }
int main() { pthread_t th1, th2; int err; if((err = pipe(mypipe)) != 0) { perror("error creating pipe: "); return 1; } pthread_create(&th2, NULL, start2, NULL); pthread_create(&th1, NULL, start1, NULL); return 0; }
В винде есть функа WaitForMultipleObjects, принимает массив объектов и ждет одного из них или всех сразу. Есть ли в линуксе что-нибудь подобное? Или, может быть, кто-то занимался такими вещами? Прошу сильно не бить, если я что-то не то говорю, - я искал в доках, но что-то ничего не нашел. А занимаюсь тредами совсем недавно. Заранее всем большое спасибо.
Ведь этот символ используется в качестве имени домашней директории...
Что-то у меня не получается. Я так понимаю, список директорий прописывается в /etc/ld.so.conf, а как мне сделать, чтобы ld находил мои *.so в моих же каталогах? Причем, конечно, для не-рута.
Братцы, что-то у меня не работает :(
Я делаю так:
ld -o myprog $(MY_OBJ) $(MY_STATIC_LIB) -lm
И используется динамическая libc.so.6.
Никаких ерроров/ворнингов не дается, но при запуске myprog получаю следующее:
bash: ./myprog: /usr/lib/libc.so.1: bad ELF interpreter: No such file or directory
Что это означает? И как мне сделать, чтобы все работало? Подскажите, плз, кто знает.
На С. Т.е. если, например, екзешник проги находится в директории, входящей в PATH, а запускаю я ее из другого места. Как узнать точное имя родной директории, где лежит екзешник?
Народ, есть проблема: нужно из программы не на языке С позвать функцию fstat. Объявляем соответствующий дефинишн... Но проблема в том, что функция fstat объявлена в stat.h как inline и, собственно, в libc.so ее просто-напросто нет. Спрашивается: как организовать это дело, чтобы моя программа была POSIX-переносимой? Может быть, есть какой-то аналог fstat? Нехорошая проблема, но если вдруг кто может подсказать что-нибудь хорошее, буду очень признателен.
Проблема у меня следующая. Есть старый код, который зовет функцию spawnv(). Эта функция не-POSIX, тем более что у меня в системе вообще нет этих функций spawn*(), а есть только posix_spawn().
Я понимаю, что spawnv при своем вызове зовет spawn. А spawn берет
в качестве параметра структуры, описывающие поведение дочернего процесса.
У spawnv таких аргументов нет. Спрашивается, какие аргументы по умолчанию
передаются spawn, когда я вызываю spawnv? Я искал-искал в доках,
но ничего по этому поводу не нашел.
Помогите мне, если кто-то сталкивался с такими проблемами.
Огромное thanx ответившему.
Где бы мне взять список стандартных POSIX С функций? Т.е. мне нужно знать, какие функции (из библиотеки С, скажем так) отвечают стандрарту POSIX.
Вот malloc() - POSIX-функция? В man malloc написано что ANSI. ANSI включает в себя POSIX? Ну а если нет, то какую функцию нужно использовать, чтобы программа соответствовала POSIX-стандарту?
Поделитесь соображениями, пожалуйста.
Заранее благодарен.
Что-то у меня ум за разум заходит... Переработал, может быть? :-/ Но НИГДЕ нет в заголовках нет этого __dirstream, а компиляется с этим символом все замечательно. У меня red hat.
Причем синхронно, т.е. cmd > log; cat log не подойдет, мне нужно сразу видеть сообщения. Кто знает, помогите, пожалуйста.
Странная вещь: есть у меня примерно такой исходник: section .text align 16 ... mov [eax+0x20], es или так: mov word [eax+0x20], es mov [eax+0x20], word es mov word [eax+0x20], word es Что неясно: во всех случаях NASM генерит код инструкции movl. Как я узнаю? Объектник, полученный насмом, передаю objdump, потом смотрю листинг, и там вместо movw стоит movl. Причем as-овский сорец компиляется правильно: .text .align 16 movw %es, 0x20(%eax) т.е. листинг, полученный objdump и оригинальный сорец совпадают. В чем может быть дело? Версия НАСМа у меня 0.98.34. Может быть, так сделать нельзя, и тогда нужно просто вставить в сорец коды нужной команды? Подскажите, если кто знает, как это сделать. Всем ответившим большое спасибо.
Огромное спасибо спасителю.
Нужно перебрать все файлы в текущей директории и для каждого из них посмотреть, является ли он скриптом /bin/sh. Для таких файлов надобно установить атрибут chmod +x. И нужно это сделать одной командой... И использовать только find, grep, ну head, cat... без perl/awk & other. У меня не получается :((( Помогите, плииииз...
Почему, когда я создаю тар-архив таким образом:
find . | tar --create --files-from=- --file=./../my_arch.tar
то каждый файл и директория присутствует в этом архве в трех экземплярах и сам архив получается соответственно в три раза больше по объему, чем сумма исходных файлов?
Например, список всех файлов (из текущей директории и всех поддиректорий), имя которых - не "*.txt"
Подскажите, плз.
Братцы, только не бейте :) Ну никак не могу это сделать: нужно в скрипте запускать компилятор несколько раз, и смотреть его код возврата. Что-то у меня не выходить :( Вот так я делал: r=`java MyClass.java` if [ $r -ne 0 ]; then echo "Bad luck" fi И не работает :( А как надо? Заранее спасибо всем откликнувшимся :)
следующие → |