0

私は簡単なプログラムを持っています:

#include <stdio.h>

int a = 5;

int
main(void)
{
    while(1)
    {
        int i;
        sleep(1);
        printf("%p %i\n", &a, a);
    }
    return 0;
}

出力 (Ubuntu x64):

0x601048 5
0x601048 5
0x601048 5
0x601048 5

私はCのポインターについて学んでいましたがmemcpy、プロセスの仮想メモリ内の(ほぼ)どこにでもデータを書き込むために使用できることをすでに知っています。しかし、別のアプリケーション (もちろん独自の仮想メモリを使用しています) を使用して、アドレスにint a配置されたの値を変更することは可能ですか? 0x601048これを行う方法?Cのみのソリューションに興味があります。

4

1 に答える 1

5

簡単にはできません (Linux 上の 2 つの異なるプロセス間で仮想メモリを共有すること)。最初の概算として、あたかもそれをコーディングすることは不可能でした。

また、そのようなメモリを共有したとしても、同期の問題が発生します。

Advanced Linux Programmingのような本を読むべきです。彼らはその問題についていくつかの章を持っています (これは複雑です)。

通常、本当にメモリを共有したい場合は、コール スタックで一部のメモリを共有しませんが、後で共有するために一部のメモリ ゾーンを「予約」します。

あなたはもっとたくさん読むことができます

  • pthread -s (たとえば、このpthread tutprialを読んでください)

  • mmap(2)を使用して設定された共有メモリセグメントMAP_SHARED

  • 特にptrace(2)を使用した低レベルのデバッグ機能PTRACE_PEEKDATA

  • shmat(2)を使用した古い SysV 共有メモリ

  • shm_open(2)を使用したPosix 共有メモリ ( shm_overview(7) ... を参照)

  • /proc/ファイルシステムproc(5)/proc/$PID/mem; file:///proc/self/maps最初はブラウザで見て、それが何を示しているのか理解できるまで読み進めることを強くお勧めします。(あなたはmmap他の人のプロセスをすることができます/proc/$PID/mem....)

  • /dev/mem(物理 RAM) mem(4)を参照

  • 非常識なトリックを行うカーネルモジュールをロードします。

初心者がこのような汚い記憶術をプレイすることは強くお勧めしません。どうしてもと言うなら、システムを壊して頻繁にバックアップする覚悟をしてください。Linux の初心者は、そのようなトリックをしないでください。

root多くの場合、特権が必要になります。機能を見る(7)

于 2013-09-28T20:38:23.387 に答える