Following this Interfacing Linux Signals article, i have been trying to use sys_rt_sigaction
in amd64, but always get memory access error when sending the signal. struct sigaction works when using C/C++ function sigaction
.
What is wrong in sys_rt_sigaction
call?
C/C++ with ASM code:
#include<signal.h>
#include<stdio.h>
#include<time.h>
void handler(int){printf("handler
");}
void restorer(){asm volatile("mov $15,%%rax
syscall":::"rax");}
struct sigaction act{handler};
timespec ts{10,0};
int main(){
act.sa_flags=0x04000000;
act.sa_restorer=&restorer;
//*
asm volatile("
mov $13,%%rax
mov %0,%%rdi
mov %1,%%rsi
mov %2,%%rdx
mov $8,%%r10
syscall
mov %%rax,%%rdi
mov $60,%%rax
#syscall
"::"i"(7),"p"(&act),"p"(0):"rax","rdi","rsi","rdx","r10");
/**/
/*
sigaction(7,&act,0);
/**/
nanosleep(&ts,0);
}
Compile
g++ -o bin -std=c++11
g++ -o bin -std=c++11 -no-pie
Send signal
kill -7 `pidof bin`
See Question&Answers more detail:os