【发布时间】:2016-01-08 07:08:23
【问题描述】:
我想在程序集中使用 sigprocmask 阻止函数中的所有信号。
以下代码在 C 中工作:
#include <stdio.h>
#include <signal.h>
int main() {
sigset_t n={(unsigned long int) 0xffffffff};
sigprocmask (SIG_BLOCK, &n, 0);
for (int i=0; i<0x8ffff; i++) printf(".");
}
当代码执行并开始在终端上打印点时,我无法使用 Ctrl+C 中断它。到目前为止一切顺利。
SIG_BLOCK 的值显然是 0; sys_rt_sigprocmask 的系统调用号为 14:
http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64
所以我写:
[BITS 64]
[section .text align=1]
global main
main:
mov r10, 32
mov rdx, 0
mov rsi, newmask
mov rdi, 0
mov rax, 14
syscall
dotPrintLoop:
mov rdi, dotstring
mov rax, 0
syscall
jmp dotPrintLoop
[section .data align=1]
dotstring: db ".",0
newmask: dd 0xffffffff
dd 0xffffffff
dd 0xffffffff
...
而且它不起作用。 gdb 表明 rax 在第一次系统调用之后的值为 -22(EINVAL - “无效参数”);而第二个系统调用(sys_write)工作得很好。
我做错了什么?
【问题讨论】:
标签: linux assembly linux-kernel signals x86-64