C スタイルのコールバックを受け取るための静的関数があります。マルチスレッド アプローチでいくつかの実験を行い、異なるアドレスの関数へのコールバックを受信する方法を試したいが、それらすべてをコードで宣言したくなく、関数を (そのエントリポイントと共に) メモリ内の別のアドレスにコピーして登録するそのアドレスをコールバックで指定します。また、関数本体で関数エントリポイントのアドレスを決定する必要があります。
C、特にLinuxのgccでこれに到達する可能性はありますか?
注:私の場合、コールバックはそのソースに固有の引数で発生します-したがって、コールバックの起点を区別することに問題はありません..ただし、マルチスレッド+フォークされた環境について説明する必要があると感じています-それでも、コールバックハンドルまたはプロセス/フォーク/スレッド ID のいずれかによって認識されます
編集:フォークは機能しません: 次のコードでは、 realme() と testme() がアドレスを共有しています。-finstrument-functions
、および memcpy+pointer の方法を実装する他のいくつかの機会について考えますbacktrace()
(以下のコメントを参照してください)。
#include <iostream>
#include <string>
// Required by for routine
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h> // Declaration for exit()
using namespace std;
int globalVariable = 2;
void realme()
{
cout << "Testme() is at: " << __builtin_return_address(1) << std::endl;
}
void testme()
{
realme();
}
main()
{
string sIdentifier;
int iStackVariable = 20;
pid_t pID = fork();
if (pID == 0) // child
{
// Code only executed by child process
sIdentifier = "Child Process: ";
globalVariable++;
iStackVariable++;
}
else if (pID < 0) // failed to fork
{
cerr << "Failed to fork" << endl;
exit(1);
// Throw exception
}
else // parent
{
// Code only executed by parent process
sIdentifier = "Parent Process:";
}
// Code executed by both parent and child.
cout << sIdentifier;
cout << " Global variable: " << globalVariable;
cout << " Stack variable: " << iStackVariable << endl;
testme();
}