Как назначить тип sdt :: function для sigevent.sigev_notify_function (таймеры POSIX)

Как и сказал Ибам, engineStrict теперь устарел. Но я нашел это решение:

check-version.js:

import semver from 'semver';
import { engines } from './package';

const version = engines.node;
if (!semver.satisfies(process.version, version)) {
  console.log(`Required node version ${version} not satisfied with current version ${process.version}.`);
  process.exit(1);
}

package.json:

{
  "name": "my package",
  "engines": {
    "node": ">=50.9" // intentionally so big version number
  },
  "scripts": {
    "requirements-check": "babel-node check-version.js",
    "postinstall": "npm run requirements-check"
  }
}

Узнайте больше здесь: https://medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4

.nvmrc

И еще одна вещь ... dotfile «.nvmrc» может использоваться для запроса определенной версии узла (но я еще не пробовал ее) - https: // github.com/creationix/nvm#nvmrc

1
задан grapes 16 January 2019 в 09:58
поделиться

2 ответа

Хорошо разработанный C callback API позволяет передавать значение в функцию обратного вызова. Это позволяет вам иметь обратные вызовы с отслеживанием состояния.

В этом случае union sigval является объединением int и void*. Вы должны придерживаться своего состояния в любом из этих двух.

std::function<Sig> может хранить состояние, поэтому вам нужно передать это состояние.

A std::function не является указателем на функцию. Для того, чтобы передать его в API обратного вызова функции C, вам нужно обернуть его и передать как часть void*.

struct sig_cb {
  void(* function)(sigval_t);
  void* pvoid;
};
sig_cb make_signal_callback( std::function<void()>* pf ) {
  return {
    [](sigval_t v) { (*static_cast<std::function<void()>*>(v.sival_ptr))(); },
    pf
  };
}

, затем измените ваш код:

functionCbType callcbk;
...
struct sigevent se;
auto cb = make_signal_callback(&callcbk);
se.sigev_notify = SIGEV_THREAD;
se.sigev_notify_function = cb.function;
se.sigev_value.sival_ptr = cb.pvoid;
se.sigev_notify_attributes = NULL;

int status = timer_create(CLOCK_MONOTONIC, &se, &timer_id);

и он должен работать. Естественно, жизнь вашего std::function должна управляться отдельно.

0
ответ дан Yakk - Adam Nevraumont 16 January 2019 в 09:58
поделиться

Структуры sigevent sigev_notify_function не ожидают объект std::function, он ожидает указатель функции:

void       (*sigev_notify_function) (union sigval);

Объект std::function может быть создан неявно из указателя функции, но обратное невозможно. Вы должны использовать указатель на фактическую функцию.

Этого можно добиться, используя callcbk.target<void(*)(union sigval)>(), чтобы получить указатель на исходный указатель функции, но тогда callcbk несколько бессмысленно.

0
ответ дан Fantastic Mr Fox 16 January 2019 в 09:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: