我正在为我的大学课堂构建一个简单的调试器,并且在处理SIGINT时遇到了问题。为什么SIGINT发送给子进程并且什么都不做?
我想要做的是当调试器进程(从现在开始PDB)接收到一个SIGINT信号并将其传递给子进程(实际上由PDB进行调试的进程)。
我这样做:
pid_t childid;
void catch_sigint(int sig)
{
signal(SIGINT,SIG_DFL);
kill(childid,sig);
}
int debuger (char *address, parm *vars)
{
int ignore=1;
int status;
childid = fork();
signal(SIGINT,catch_sigint);
if(childid==0)
{
ptrace(PTRACE_TRACEME,0, NULL,NULL);
if(execve(address,NULL,NULL)==-1)
{
perror("ERROR occured when trying to create program to trace\n");
exit(1);
}
}
else
{
int f_time=1;
while(1)
{
long system_call;
wait(&status);
if(WIFEXITED(status))break;
if(WIFSIGNALED(status))break;
system_call = ptrace(PTRACE_PEEKUSER,childid, 4 * ORIG_EAX, NULL);
if(!strcmp(vars->category,"process-control") || !strcmp(vars->category,"all"))
ignore = pr_calls(system_call,ignore,limit,childid,vars->mode); //function that takes the system call that is made and prints info about it
if(!strcmp(vars->category,"file-management") || !strcmp(vars->category,"all"))
ignore = fl_calls(system_call,ignore,limit,childid,vars->mode);
if(f_time){ignore=1;f_time=0;}
ptrace(PTRACE_SYSCALL,childid, NULL, NULL);
}
}
signal(SIGINT,SIG_DFL);
return 0;
}
的运行程序和fork一个子进程和exec一个程序来跟踪它的系统调用。当它没有得到任何信号时,它工作正常。
但是当在一些跟踪的中间我按ctrl + c我期望子进程停止,并且PDB继续并停止(因为这条线if(WIFSIGNALED(status))break;
。这从来没有发生过。它跟踪它的程序继续它的系统调用。和打印
的追踪程序是:
#include <stdio.h>
int main(void)
{
for(;;) printf("HELLO WORLD\n");
return 0;
}
该方案继续打印HELLO WORLD我打了CTRL + C即使
我还观察到,系统调用的ptrace℃之后给出。 trl + c是-38,并且在等待状态从1407(我认为是正常值)到639的信号只改变一次,然后在下一次等待时再次回到1407。
那么我在做什么错?