在ptraced Linux进程中调用ptrace

有人在Wikipedia “ptrace” article中声称,在Linux上,一个ptraced进程本身无法进行另一个进程.我试图确定是否(以及如果是这样的原因)就是这种情况.下面是一个我试图测试的简单程序.我的程序失败(子子进程无法正常运行)但我确信这是我的错误,而不是基本的东西.

从本质上讲,初始过程A分叉进程B进而分叉C.对其子B进行ptra,B对其子进行处理C.一旦它们被设置,所有三个进程都被写入只打印A,B或C到stdout每秒一次.

在实践中发生的事情是A和B工作正常,但C只打印一次然后卡住.检查ps -eo pid,cmd,wchan显示C卡在内核函数ptrace_stop中,而其余的都在hrtimer_nanosleep中,我希望这三个都是.

偶尔三个都可以工作(所以程序打印Cs以及As和Bs),这让我相信初始设置中存在一些竞争条件.

我猜测可能出现的问题是:

>与A有关A看到与B相关的SIGCHLD看到SIGCHLD与C的信号有关,并等待(2)将​​两者报告为来自B(但是对两个pids的一个hacky调用PTRACE_CONT并不能解决问题) ?
> C应该被B跟踪 – C代替继承了ptrace(而B的调用ptrace既没有错也没有覆盖它)?

谁能弄清楚我做错了什么?谢谢.

#include dio.h>
#include 
最佳答案
你确实看到了竞争条件.你可以通过放睡来重复发生它(1);紧接在第二次fork()调用之前.

由于进程A未正确地将信号传递给进程B,因此导致竞争条件.这意味着如果进程B在进程A开始跟踪进程B之后开始跟踪进程C,则进程B永远不会获得指示进程C已停止的SIGCHLD信号,所以它永远不会继续下去.

解决此问题,您只需修复SIGCHLD处理程序:

static void sigchld_handler(int sig){
    int result,status;
    pid_t child_pid = wait(&status); // find who send us this SIGCHLD

    printf("%d received SIGCHLD on %d\n",getpid(),child_pid);
    if (WIFSTOPPED(status))
    {
        result=ptrace(PTRACE_CONT,WSTOPSIG(status));
        if(result) {
            perror("continuing after SIGCHLD");
        }
    }
}

相关文章

文件查找(find) 1 find 简单的说,就是实时查找指定的内容或条件。特点:最新、最快、最准确。 用法:...
非交互式添加分区 方法一 添加/deb/sdb 下的分区,其实位置为1到1000M,第二个分区位置为1001至3000M,...
编译安装httpd 1 去官网下载源码包 为避免非法软件,一定要去官网下载http://www.apache.org httpd-2.4...
gdisk用法 gdisk - InteractiveGUIDpartitiontable (GPT) manipulator GPTfdisk (akagdisk) isatext-mo...
1 一定用快捷键 这里简单的说下几个常用的快捷按键。 1.1 移动光标快捷键 Crtl + a 光标回到命令行...
bash shell中测试命令 test命令提供了if-than语句中测试不同条件的途径。如果test命令中列出的条件成立...