Я собираюсь написать пользовательскую библиотеку потоков, так как, похоже, в этой области нет активной работы, и я верю, что C++0x обещает и фьючерсы могут придать этой модели некоторую силу. К сожалению, для того, чтобы эта модель работала, необходимо обеспечить переключение контекста при блокировке вызовов. Таким образом, я хотел бы перехватывать каждый системный вызов, чтобы заменить его асинхронной версией. Есть некоторые предостережения:
- Я знаю, что почти для каждого обычного системного вызова существуют асинхронные системные вызовы, но по соображениям обратной совместимости это не является жизнеспособным решением.
- Я знаю, что в Linux 2.4 или более ранних версиях можно было напрямую изменить sys_call_table, но это исчезло.
- Поскольку я хотел бы, чтобы моя библиотека была при желании статически связана, трюк LD_PRELOAD нежизнеспособен.
- Точно так же модули ядра не подходят, поскольку предполагается, что это пользовательская библиотека.
- Наконец, ptrace() также не подходит по тем же причинам. Я не могу, чтобы моя библиотека разветвляла новый процесс только для того, чтобы ее можно было использовать.
Это возможно?
ptrace
сам сделал это возможным? Даже если это не так, вы можете изучить, какstrace
перехватывает системные вызовы. - person Omnifarious   schedule 08.11.2011