0

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();
}
4

2 に答える 2

1

これには、自己修正コードを作成する必要がありますが、それほど単純ではないという事実は別として、パフォーマンスが大幅に低下します。それほど問題なく必要なものをシミュレートする唯一の方法は、コールバック関数ポインターを渡す必要があるたびに新しい関数を作成するある種のマクロを作成することですが、コンパイル時に知っておく必要があります。おそらく、マクロは、参照するたびに、特定のパラメーターに基づいて .c ファイルに関数を生成できます。

PSは話して#defineいませんが、プリコンパイル時に呼び出されるアプリで、キーワードを検索して.cファイルにエントリを作成します

于 2011-07-07T13:14:35.737 に答える
1

Cでこれを確実に実行できるとは思いません。関数内にあるコードが、実行された後、それ自体の位置から独立しているという保証はありません(ローカルブランチについて考えてください)。C では関数のサイズを取得する方法がないため、どれだけコピーすればよいかわかりません。

于 2011-07-07T12:53:56.713 に答える