2012-04-13 8 views
0
私はMAP_ANONYMOUSフラグで使用していない場合、shm_openしようとしている

Cプログラミング:フォーク全体で保護されたメモリ()

  • 子内のページから親内のページを保護する必要が

    とFD = -1のmmapで。

  • 私は、fchmodで基礎となるメモリを保護しようとしました。

私は現在、次の設定を利用しています:

shm_unlink("/mymem"); 
int fd = shm_open("/mymem", O_RDWR | O_CREAT,0777); 

printf("FD is :%d\n", fd); 
ftruncate(fd, numberPages*getpagesize()); 

int *z = mmap(NULL, getpagesize()*numberPages, PROT_WRITE|PROT_READ, MAP_SHARED,fd,0); 
printf("Memory is at : %p\n", z); 

if(fork()){ 
    printf("Protecting %d\n",mprotect(z, getpagesize(), PROT_NONE)); 
    printf("(1)No issues, apparently\n"); 

    sleep(2); 
    exit(1); 
}else{ 
    sleep(1); 
    *z = 3; 
    printf("(2)No issues, apparently\n"); 
    sleep(5); 
    printf("Value of z: %d\n",*z); 
} 

親プロセスは、もは​​や読むことができるように、私は(MPROTECTで、またはその他の)ページを保護できるようにするには、子プロセスを必要としません/ページに書き込む。

受信出力は次のとおりです。

FD is :3 
Memory is at : 0xf581a000 
Protecting 0 
(1)No issues, apparently 
(2)No issues, apparently 
Value of z: 3 

私は、z = 3

は残念ながら、子供がこの機能を持っている必要があります*ラインで発生するセグメンテーションフォールトを期待して(というか、希望する)していますそれはTCPサーバーとしても動作しており、(私が考えていない別の方法がない限り)TCP接続を介してページをブロックする要求が受信されます。

アドバイスはありますか?

答えて

1

子プロセスのmrotect()はもちろん、親プロセスではなく、子プロセス自体のページのアクセス許可を変更します。 )(

MPROTECTあなたの質問を変更する方法に帰着

(強調追加)プロセスのメモリページ(複数可)

を呼び出すの保護を変更します。それは文書化されてい別のプロセス(呼び出しプロセスではない)のメモリマッピングの許可。ターゲットプロセス(メモリマッピングが変更されるプロセス)の参加がなければ、これを行うための移植可能な方法はないと私は考えています。私がそれを行うと考えることができる唯一の方法は、ターゲットプロセスにデバッガとして接続することです(たとえば、Linuxの場合ptrace()を参照)。それは複雑な解決策です。 mprotect()をそれ自身で実行するように求めるメッセージを、親プロセス(たとえばパイプ経由)に送信することを検討しましたか?

+0

あなたは問題を正確に釘付けにしました。私は今ptrace()を調べるつもりです。残念ながら、親プロセスは常に他の操作を実行しているので、メッセージが到着するのを待つ間にブロックすることはできません>< – Tabgok

+0

子プロセスからのメッセージを待つスレッドを親プロセスに作成することができます親プロセスのメインスレッドは作業を開始します。 – Celada

+0

Hmmm - それは悪い考えではない、私は昼食後にそれを試してみる。 – Tabgok

関連する問題