аналоги функций timer_create()/timer_delete()
От: salvequick  
Дата: 02.12.10 19:06
Оценка:
какие аналоги функций timer_create()/timer_delete() существуют?

имеется система где отсутствует реализация этих функций. это MAC OS X
нужно чем то заменить их.

функции getitimer()/setitimer() в MAC OS есть но они предлагают несколько не то. они предоставляют доступ к одному таймеру системному.
Re: аналоги функций timer_create()/timer_delete()
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 02.12.10 19:38
Оценка: 2 (1)
Тебе требуется доступ именно на уровне Си? А то в Cocoa имеется NSTimer, кроме того есть есть системный интерфейс IOTimerEventSource.
Re[2]: аналоги функций timer_create()/timer_delete()
От: salvequick  
Дата: 03.12.10 07:49
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Тебе требуется доступ именно на уровне Си? А то в Cocoa имеется NSTimer, кроме того есть есть системный интерфейс IOTimerEventSource.


да нужно на Си. портируется программа с Linux.
поэтому obj-C Cocoa классы точно не подойдут. так что NSTimer отпадает.
а вот на системный интерфейс IOTimerEventSource я взгляну поподробнее.

хотя про него вон что пишут и он чисто mac specific

Remember the system doesn't guarantee the accuracy of the callout

Re[3]: аналоги функций timer_create()/timer_delete()
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 03.12.10 08:29
Оценка:
Здравствуйте, salvequick, Вы писали:

S>хотя про него вон что пишут и он чисто mac specific

S>

S>Remember the system doesn't guarantee the accuracy of the callout


Если дочитать про "не гарантируют" до конца, там все не так уж и страшно. Ну а то что Mac specific, мне кажется это не так уж и страшно, у тебя же не единый бинарник на все платформы.
Да, еще ты можешь воспользоваться mk_timer_create, но она не экспортируется явно, и нет гарантий что после очередного пачта все не развалится. Тем не менее, внутри Cocoa используется имено она.
Re[4]: аналоги функций timer_create()/timer_delete()
От: salvequick  
Дата: 06.12.10 08:34
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Да, еще ты можешь воспользоваться mk_timer_create, но она не экспортируется явно, и нет гарантий что после очередного пачта все не развалится. Тем не менее, внутри Cocoa используется имено она.


а у mk_timer_* прототипы не подскажешь?
символы я нашел в glibc а объявления в include то нету.

там 4е функции mk_timer_create, mk_timer_cancel, mk_timer_arm, mk_timer_destroy.
вообще хоть какая то документация есть по ним? даже google тут пасует
Re[5]: аналоги функций timer_create()/timer_delete()
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 06.12.10 08:46
Оценка:
Здравствуйте, salvequick, Вы писали:

S>а у mk_timer_* прототипы не подскажешь?

S>символы я нашел в glibc а объявления в include то нету.

подскажу

mach_port_name_t    mk_timer_create(void);

kern_return_t    mk_timer_destroy(
                    mach_port_name_t    name);

kern_return_t    mk_timer_arm(
                    mach_port_name_t    name,
                    uint64_t            expire_time);

kern_return_t    mk_timer_cancel(
                    mach_port_name_t    name,
                    uint64_t            *result_time);


S>вообще хоть какая то документация есть по ним? даже google тут пасует


Тут все просто, на самом деле. Тебе нужно сходить вот сюды, зарегистрироваться там и скачать актуальную для тебя версию XNU.
Re[6]: аналоги функций timer_create()/timer_delete()
От: salvequick  
Дата: 06.12.10 13:50
Оценка:
Здравствуйте, kaa.python, Вы писали:

у меня все заканчивается ошибкой на компиляции.

error: IOKit/IOTimerEventSource.h: No such file or directory


IOKit надо разве отдельно устанавливать?
этого файла на самом деле нет в /usr/include

честно говоря и mk_timer_create тоже не заработал
на этапе линковки не находит компилятор эти функции. функции точно есть там вот вывод nm

nm /usr/lib/libc.dylib | grep timer
000baa4c t ___getitimer
0006eec8 t ___setitimer
000baa4c T _getitimer
000013a0 T _mk_timer_arm
000013ac T _mk_timer_cancel
00001388 T _mk_timer_create
00001394 T _mk_timer_destroy
0006eec8 T _setitimer


что же у меня libc не линкуется.
Re[7]: аналоги функций timer_create()/timer_delete()
От: blackhearted Украина  
Дата: 06.12.10 14:04
Оценка: 2 (1)
Здравствуйте, salvequick, Вы писали:

S>Здравствуйте, kaa.python, Вы писали:


S>у меня все заканчивается ошибкой на компиляции.


S>

S>error: IOKit/IOTimerEventSource.h: No such file or directory


S>IOKit надо разве отдельно устанавливать?

S>этого файла на самом деле нет в /usr/include

S>честно говоря и mk_timer_create тоже не заработал

S>на этапе линковки не находит компилятор эти функции. функции точно есть там вот вывод nm

S>

S>nm /usr/lib/libc.dylib | grep timer
S>000baa4c t ___getitimer
S>0006eec8 t ___setitimer
S>000baa4c T _getitimer
S>000013a0 T _mk_timer_arm
S>000013ac T _mk_timer_cancel
S>00001388 T _mk_timer_create
S>00001394 T _mk_timer_destroy
S>0006eec8 T _setitimer


S>что же у меня libc не линкуется.


Они, скорее всего, не экспортируются.
Re[8]: аналоги функций timer_create()/timer_delete()
От: salvequick  
Дата: 06.12.10 14:12
Оценка:
Здравствуйте, blackhearted, Вы писали:

B>Они, скорее всего, не экспортируются.


да вот говорят, что они экспортируются, но неявно.
т.е в inlude файлах прототипов нет.
прототипы я добавил вручную.
Re[7]: аналоги функций timer_create()/timer_delete()
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 06.12.10 14:15
Оценка: 2 (1)
Здравствуйте, salvequick, Вы писали:

Итак.

S>IOKit надо разве отдельно устанавливать?

S>этого файла на самом деле нет в /usr/include

Вот тут я погнал, этот метод доступен только из ядра.

S>честно говоря и mk_timer_create тоже не заработал

S>на этапе линковки не находит компилятор эти функции. функции точно есть там вот вывод nm

Да, их надо получать путем загрузки вручную и получения адреса функции по имени.
Кроме того, тебе скорей всего подойдет CFRunLoopTimer. Это менее геморно и куда более кошерно.
Re[9]: аналоги функций timer_create()/timer_delete()
От: blackhearted Украина  
Дата: 06.12.10 14:21
Оценка:
Здравствуйте, salvequick, Вы писали:

S>Здравствуйте, blackhearted, Вы писали:


B>>Они, скорее всего, не экспортируются.


S>да вот говорят, что они экспортируются, но неявно.

S>т.е в inlude файлах прототипов нет.
S>прототипы я добавил вручную.

ну надо бы посмотреть как вы их добавляли и как они были объявлены при сборке либы.
Re[8]: аналоги функций timer_create()/timer_delete()
От: salvequick  
Дата: 09.12.10 13:17
Оценка:
Здравствуйте, kaa.python, Вы писали:

CFRunLoopTimer. Это менее геморно и куда более кошерно.


К сожалению он имееет секундную точность.

CFRunLoopTimerRef CFRunLoopTimerCreate (
   CFAllocatorRef allocator,
   CFAbsoluteTime fireDate,
   CFTimeInterval interval,
   CFOptionFlags flags,
   CFIndex order,
   CFRunLoopTimerCallBack callout,
   CFRunLoopTimerContext *context
);


Тут написано правда что есть возможность некий adjust, но непонятно как. Вручную nanosleep чтоли вызывать.
И это все хорошо если таймер работает не циклически а заведен на однократное срабатывание, а то придется все эти задержки запоминать.

fireDate
The time at which the timer should first fire. The fine precision (sub-millisecond at most) of the fire date may be adjusted slightly by the timer if there are implementation reasons to do.


--------------------------------------------------------

по поводу функций из libc mk_timer_create/mk_timer_delete.
я получил к ним доступ через dlload/dlsym/dlclose

из прототипов видно что невозможно узнать время сколько натикало у таймера.
только при выпорлнении mk_timer_cancel это возможно.

и еще непонятно как например вызвать функцию или послать сигнать при срабатывании таймера.

mach_port_name_t    mk_timer_create(void);

kern_return_t    mk_timer_destroy(
                    mach_port_name_t    name);
kern_return_t    mk_timer_arm(
                    mach_port_name_t    name,
                    uint64_t            expire_time);
kern_return_t    mk_timer_cancel(
                    mach_port_name_t    name,
                    uint64_t            *result_time);


кстати expire_time тут похоже что в миллисекундах?

вот не ожидал я такой засады с таймерами. странно это все. такая нужная вешь и нет ее.
получается что механизма аналогичного просто нету.

чуть ли не смотри реализацию timer_create/timer_delete и пиши свои.
Re[9]: аналоги функций timer_create()/timer_delete()
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 10.12.10 06:16
Оценка:
Здравствуйте, salvequick, Вы писали:

S>

CFRunLoopTimer. Это менее геморно и куда более кошерно.


S>К сожалению он имееет секундную точность.


Да вроде как нет.

typedef double CFTimeInterval;


Ты можешь в дробную часть тоже значение загнать. А насколько я понимаю описание, миллисекунды работать будут, но точность не гарантируется. Попробуй написать тест с 1/10 секунды, будет видно, срабатывает или нет.

S>--------------------------------------------------------


S>и еще непонятно как например вызвать функцию или послать сигнать при срабатывании таймера.


Разве что искать примеры использования

S>вот не ожидал я такой засады с таймерами. странно это все. такая нужная вешь и нет ее.

S>получается что механизма аналогичного просто нету.

Есть. Я все же склоняюсь к тому, что Дробная часть нормально отработает.

На вскидку еще могу предложить тебе воспользоваться GCD (но только для 10.6 и выше):
dispatch_time_t dispatch_time(dispatch_time_t base, int64_t offset);


А так же посмотреть на функцию clock_alarm из Mach.

P.S. Если ждет, я уже сам крайне заинтересовался данным вопросом, и на выходных плотно займусь им.
Re[10]: аналоги функций timer_create()/timer_delete()
От: salvequick  
Дата: 10.12.10 12:52
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Ты можешь в дробную часть тоже значение загнать. А насколько я понимаю описание, миллисекунды работать будут, но точность не гарантируется. Попробуй написать тест с 1/10 секунды, будет видно, срабатывает или нет.

KP>Есть. Я все же склоняюсь к тому, что Дробная часть нормально отработает.

да не подумал я о том, что этот параметр может и не int.
заработало с дробными значениями!

KP>P.S. Если ждет, я уже сам крайне заинтересовался данным вопросом, и на выходных плотно займусь им.


да не горит потому что куча задач по портированию и я потихоньку переключаясь с одного на другое продвигаюсь вперед.

я проанализировал прикладной API Linux и MACOSX и в целом могу сказать что основные отличия это:
* отсутствие в macosx posix таймеров .
* отсутствие в macosx файловой системы /proc/
* другой набор sysctl в macosx
* отсутствие в macosx spin lock.
* отсутствие в macos как posix так и systemV очередей сообщений.
* отсутствие в macosx netlink socket API.
* отсутствие в macosx netfiler. хотя в macos вроде бы можно использовать ipfw.
* fcntl() некоторые отличия в командах. нет F_NOTIFY, F_SETLEASE, F_GETLEASE.

все остальное вроде должно ложиться без переделок.

был на сайте твоего проекта macosinternals.com. почерпнул несколько интересных моментов, например получение списка процессов.
Task Explorer у меня к сожалению не заработал на машине.
Re[11]: аналоги функций timer_create()/timer_delete()
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 11.12.10 18:54
Оценка:
Здравствуйте, salvequick, Вы писали:

S>я проанализировал прикладной API Linux и MACOSX и в целом могу сказать что основные отличия это:


S>* другой набор sysctl в macosx

Должен быть более похож на BSD. Все же оттуда ноги растут.
S>* отсутствие в macosx spin lock.
Спинлоки все же есть.
S>* отсутствие в macos как posix так и systemV очередей сообщений.
Есть msgctl, msgget, msgrcv, msgsnd. Ну и есть еще Mach сообщения.
S>* отсутствие в macosx netfiler. хотя в macos вроде бы можно использовать ipfw.
Можно.
S>* fcntl() некоторые отличия в командах. нет F_NOTIFY, F_SETLEASE, F_GETLEASE.

S>был на сайте твоего проекта macosinternals.com. почерпнул несколько интересных моментов, например получение списка процессов.

S>Task Explorer у меня к сожалению не заработал на машине.

А вот это меня больше всего заинтересовало. Что именно не заработало? Исталлятор, падение или что? Можешь по-подроблее рассказать? Какая ОС и что не так.
Re[12]: аналоги функций timer_create()/timer_delete()
От: salvequick  
Дата: 13.12.10 06:40
Оценка:
Здравствуйте, kaa.python, Вы писали:

S>>* отсутствие в macosx spin lock.

KP>Спинлоки все же есть.
Меня интересовали POSIX спинлоки из Pthread библиотеки и их нету.
Хорошо что есть замена.

S>>* отсутствие в macos как posix так и systemV очередей сообщений.

KP>Есть msgctl, msgget, msgrcv, msgsnd. Ну и есть еще Mach сообщения.
Они есть в include , но в документации в manpages, и в manpages на сайте Apple их нету.
Меня это смутило я думал что это просто заглушки.
Проверил сейчас и выяснил что они работают.

KP>А вот это меня больше всего заинтересовало. Что именно не заработало? Исталлятор, падение или что? Можешь по-подроблее рассказать? Какая ОС и что не так.


На macos 10.6.5, macmini второго поколения 2010 тонкий. task explorer работает.
Не заработало на macos 10.5.8. manmini первого поколения 2008 толстый.
Программа устанавливается без проблем, однако при старте возникает системное сообщение об ошибке.
Пробовал несколько раз , пробовал и рестарт системы делать.
Могу выслать логи из сообщения об ошибке и конфигурацию системы.
Re[13]: аналоги функций timer_create()/timer_delete()
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 13.12.10 07:56
Оценка:
Здравствуйте, salvequick, Вы писали:

S>Они есть в include , но в документации в manpages, и в manpages на сайте Apple их нету.

S>Меня это смутило я думал что это просто заглушки.
S>Проверил сейчас и выяснил что они работают.

К сожалению, для всего что ниже Cocoa это обычная ситуация. Постоянно приходится в XNU лазить и смотреть что да как на самом деле.

S>Не заработало на macos 10.5.8. manmini первого поколения 2008 толстый.


Спасибо. Видимо что-то отвалилось, я давно на 10.5 не тестил.
Re[14]: аналоги функций timer_create()/timer_delete()
От: salvequick  
Дата: 21.12.10 09:25
Оценка:
а еще не подскажешь ...
почему может вызов sysctl KERN_ARGMAX2 не возвращает мне командную строку процесса, а часто вообще приводит к ошибке (-1) ?
может какой то ньюанс есть?
запускал c root правами

я взял пример с получением списка процессов из статьи на macosinternals.com
Re[15]: аналоги функций timer_create()/timer_delete()
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 21.12.10 09:43
Оценка:
S>почему может вызов sysctl KERN_ARGMAX2 не возвращает мне командную строку процесса, а часто вообще приводит к ошибке (-1) ?
S>может какой то ньюанс есть?
S>запускал c root правами

С root правами ты только на kernel_task обламываться должен, вобщем-то. Каких-то других ньюансов я не замечал. То что ты говоришь очень похоже на отсутствие привилегий. Как вариант, может быть дело в том, что ты пытаешься получить информацию по уже завершившемуся процессу.
Re: аналоги функций timer_create()/timer_delete()
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 29.12.10 08:08
Оценка:
Написал небольшой обзорчик.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.