c
1#include <unistd.h> 2#include <sys/mman.h> 3#include <stdio.h> 4#include <stdlib.h> 5#include <err.h> 6 7#define BUFFER_SIZE 1000 8#define ALLOC_SIZE (1000 * 1024 * 1024) 9 10static char command[BUFFER_SIZE]; 11 12int main(void) 13{ 14 pid_t pid; 15 16 pid = getpid(); 17 snprintf(command, BUFFER_SIZE, "cat /proc/%d/maps", pid); 18 puts("*** memory map before memory allocation ***"); 19 20 fflush(stdout); 21 system(command); 22 23 void *new_memory; 24 new_memory = mmap(NULL, ALLOC_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 25 if (new_memory == (void *) -1) 26 err(EXIT_FAILURE, "mmap() failed"); 27 28 puts(""); 29 printf("*** succeeded to allocate memory: address = %p; size = 0x%x ***\n", 30 new_memory, ALLOC_SIZE); 31 puts(""); 32 33 puts("*** memory map after memory allocation ***"); 34 fflush(stdout); 35 system(command); 36 37 if (munmap(new_memory, ALLOC_SIZE) == -1) 38 err(EXIT_FAILURE, "munmap() failed"); 39 exit(EXIT_SUCCESS); 40} 41
このコードはプロセスのメモリマップ情報を表示し、メモリを新たに100Mバイト確保し、再度メモリマップ情報を表示するプログラムです。
このコードを実行した結果が下です。
result
1*** memory map before memory allocation *** 2555ca8999000-555ca899a000 r--p 00000000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 3555ca899a000-555ca899b000 r-xp 00001000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 4555ca899b000-555ca899c000 r--p 00002000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 5555ca899c000-555ca899d000 r--p 00002000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 6555ca899d000-555ca899e000 rw-p 00003000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 7555ca9754000-555ca9775000 rw-p 00000000 00:00 0 [heap] 87f551138c000-7f55113b1000 r--p 00000000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 97f55113b1000-7f5511529000 r-xp 00025000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 107f5511529000-7f5511573000 r--p 0019d000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 117f5511573000-7f5511574000 ---p 001e7000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 127f5511574000-7f5511577000 r--p 001e7000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 137f5511577000-7f551157a000 rw-p 001ea000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 147f551157a000-7f5511580000 rw-p 00000000 00:00 0 157f5511594000-7f5511595000 r--p 00000000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 167f5511595000-7f55115b8000 r-xp 00001000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 177f55115b8000-7f55115c0000 r--p 00024000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 187f55115c1000-7f55115c2000 r--p 0002c000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 197f55115c2000-7f55115c3000 rw-p 0002d000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 207f55115c3000-7f55115c4000 rw-p 00000000 00:00 0 217fff38e57000-7fff38e78000 rw-p 00000000 00:00 0 [stack] 227fff38edf000-7fff38ee2000 r--p 00000000 00:00 0 [vvar] 237fff38ee2000-7fff38ee3000 r-xp 00000000 00:00 0 [vdso] 24ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall] 25 26*** succeeded to allocate memory: address = 0x7f54d2b8c000; size = 0x3e800000 *** 27 28*** memory map after memory allocation *** 29555ca8999000-555ca899a000 r--p 00000000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 30555ca899a000-555ca899b000 r-xp 00001000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 31555ca899b000-555ca899c000 r--p 00002000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 32555ca899c000-555ca899d000 r--p 00002000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 33555ca899d000-555ca899e000 rw-p 00003000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 34555ca9754000-555ca9775000 rw-p 00000000 00:00 0 [heap] 357f54d2b8c000-7f551138c000 rw-p 00000000 00:00 0 367f551138c000-7f55113b1000 r--p 00000000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 377f55113b1000-7f5511529000 r-xp 00025000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 387f5511529000-7f5511573000 r--p 0019d000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 397f5511573000-7f5511574000 ---p 001e7000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 407f5511574000-7f5511577000 r--p 001e7000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 417f5511577000-7f551157a000 rw-p 001ea000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 427f551157a000-7f5511580000 rw-p 00000000 00:00 0 437f5511594000-7f5511595000 r--p 00000000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 447f5511595000-7f55115b8000 r-xp 00001000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 457f55115b8000-7f55115c0000 r--p 00024000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 467f55115c1000-7f55115c2000 r--p 0002c000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 477f55115c2000-7f55115c3000 rw-p 0002d000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 487f55115c3000-7f55115c4000 rw-p 00000000 00:00 0 497fff38e57000-7fff38e78000 rw-p 00000000 00:00 0 [stack] 507fff38edf000-7fff38ee2000 r--p 00000000 00:00 0 [vvar] 517fff38ee2000-7fff38ee3000 r-xp 00000000 00:00 0 [vdso] 52ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall] 53
この結果に乗っている
** succeeded to allocate memory: address = 0x7f54d2b8c000; size = 0x3e800000 **
から
7f54d2b8c000-7f551138c000
というアドレスが新しくmmap関数で取得したアドレスです。
その後領域サイズを確認しようとPythonで
python
1$ python -c "print(7f551138c000 - 7f54d2b8c000)"
を実行してみたのですが、下記のようにエラーが出ます。
result
1 File "<string>", line 1 2 print(7f551138c000 - 7f54d2b8c000) 3 ^ 4SyntaxError: invalid syntax
これは何がいけないのでしょうか?
書籍の通りタイプしたと思うのですが原因がわかりません。b
Pythonは全くわからないので、困っています。
よろしくお願いいたします。
環境
OS ubuntu 20.0
C言語コンパイラ gcc
Python 2.7.18rc1 (default, Apr 7 2020, 12:05:55)
[GCC 9.3.0] on linux2
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/23 12:07