【发布时间】:2016-07-28 15:33:17
【问题描述】:
我使用的是 64 位 Linux x86。我需要使用syscall 函数执行mmap 系统调用。 mmap 系统调用号为 9:
printf("mmap-1: %lli\n", syscall(9, 0, 10, 3, 2 | 32, -1, 0));
printf("mmap-2: %lli\n", mmap( 0, 10, 3, 2 | 32, -1, 0));
但是,当我运行它时,syscall 函数给出了错误的结果。
mmap-1: 2236940288
mmap-2: 140503502090240
mmap-1: 3425849344
mmap-2: 140612065181696
mmap-1: 249544704
mmap-2: 139625341366272
mmap 工作得很好,但返回的“地址”syscall 导致Segmentation fault。 syscall 的值似乎被转换为 32 位或其他东西。
我做错了什么?
【问题讨论】:
-
据我在手册页上看到,
syscall返回一个int,而不是long long或指针...?!? -
@DevSolar 没错,我现在正在使用
gcc,但是,在另一个使用 Node.js gyp 编译器的项目中,我认为syscall返回了 64 位值,并且一切正常。无论如何,执行“64 位”系统调用的正确方法是什么? -
这个page 说系统调用返回
long -
如果它返回
long,那你为什么要打印%lli?long的前缀是l
标签: c system-calls mmap