- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有一个很好的合作PTRACE_TRACEME
由 PTRACE
处理的子程序包装程序。
问题是如果管理员(或其他)决定 SIGSTOP
子程序,我该如何处理?并拿起SIGCONT
后来,当然。
答案可能是“你不能”?这是PTRACE
毕竟!
我可以看到 PTRACE_LISTEN
(从 Linux 3.4 开始)可以发挥作用,将子程序置于停止状态,但据记载,只有在子程序与 PTRACE_SEIZE
连接时才能工作。 .
我尝试了调用 PTRACE_LISTEN
的琐碎事情当在 PTRACE_TRACEME
在 Group-stop 模式下,我得到了 Old McDonald 错误 - EIO
.
我有一个想法,我可以注入(inject)代码来做 sigsuspend
,但当然这只会暂停子程序的 1 个线程。我必须向每个线程注入(inject)一个信号然后将它们全部停止?然后重启?
或者也许执行重新交付SIGSTOP
已经阻止了他们?在这种情况下,我的 sigsuspend
真的被触发了吗?我想如果另一个线程报告 SIGCONT
我可以直接触发它.
虽然这听起来很有趣,但我想知道我是否错过了 PTRACE
中的一个技巧。文件?也许有办法到达 PTRACE_SEIZE
我缺少的兼容模式?
[更多鱼子酱]
为什么不首先使用 PTRACE_SEIZE 呢?
PTRACE_SEIZE
模式或模拟
SIGSTOP
API 内的行为?
最佳答案
一个例子 PTRACE_SEIZE 下面是模拟 SIGSTOP 行为的测试程序。
#define PTRACE_SEIZE 0x4206
#define PTRACE_SEIZE_DEVEL 0x80000000
static const struct timespec ts100ms = { .tv_nsec = 100000000 };
static const struct timespec ts1s = { .tv_sec = 1 };
static const struct timespec ts3s = { .tv_sec = 3 };
int main(int argc, char **argv)
{
pid_t tracee;
tracee = fork();
if (tracee == 0) {
nanosleep(&ts100ms, NULL);
while (1) {
printf("tracee: alive\n");
nanosleep(&ts1s, NULL);
}
}
if (argc > 1)
kill(tracee, SIGSTOP);
nanosleep(&ts100ms, NULL);
ptrace(PTRACE_SEIZE, tracee, NULL,
(void *)(unsigned long)PTRACE_SEIZE_DEVEL);
waitid(P_PID, tracee, NULL, WSTOPPED);
ptrace(PTRACE_CONT, tracee, NULL, NULL);
nanosleep(&ts3s, NULL);
printf("tracer: exiting\n");
return 0;
}
当上面的代码在没有参数的情况下被调用时,tracee 被从
# ./test-seize
tracee: alive
tracee: alive
tracee: alive
tracer: exiting
# tracee: alive
tracee: alive
tracee: alive
当使用参数调用时,tracee 会从停止状态中被捕获,并且
# ./test-seize
tracee: alive
tracee: alive
tracee: alive
tracer: exiting
# ps -el|grep test-seize
1 T 0 4720 1 0 80 0 - 941 signal ttyS0 00:00:00 test-seize
您可以在
thread 阅读更多内容
关于c - 如何在 ptracer 中处理 SIGSTOP/SIGCONT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63954630/
它不是 Ctrl+Z。那是为了 SIGTSTP .另外,stty -a显示 ^S 作为组合,但它似乎不起作用。 最佳答案 没有发送 SIGSTOP 的组合键。 Control-S 告诉终端驱动程序暂停
我创建了一个脚本,我希望它对 SIGSTOP 几乎“免疫”。 我了解 SIGKILL 和 SIGSTOP 都不能被捕获或忽略。 我知道 Linux 的 init 系统无法接收到“致命”信号,因为它的信
我有一个运行 bash 脚本的 Python 脚本。我需要能够终止 bash 脚本,如果它看起来是无限的,并且它还必须在 chroot jail 中运行,因为该脚本可能很危险。我使用 psutil.P
我的测试代码是 #include #include #include #include int main() { int c = fork(); if (c == 0) while(1
我正在研究信号:特别是 SIGSTOP 和 SIGCONT。这是我写的一个测试程序。这个想法是创建一个 N + 1 的链进程(包括主进程)。每个人都必须等待它的 child 停止,然后停止本身。当后者
只是想知道 SIGSTOP 和 SIGTSTP 信号之间的区别。 最佳答案 这两个信号都旨在挂起一个进程,该进程最终将通过 SIGCONT 恢复。它们之间的主要区别是: SIGSTOP 是以编程方式发
不幸的是SIGSTOP无法被捕获。之前向我的进程发送 SIGTERM 是常见的还是好的做法,这样我就可以正常关闭我的脚本?两者之间没有足够的时间,我需要 sleep 1 秒吗? kill SIGSTO
我尝试通过发送 SIGSTOP 停止进程,然后在选择 (4min) 的超时值后发送 SIGCONT。 select 调用立即失败并出现 timeout,有没有办法阻止 select 的计时器在进程卡住
我在 python 中有一个非常简单的 tcp 服务器,其代码如下: #!/usr/bin/env python
我试图在 mans 中找到这个,但可以找到正确的人或正确的段落。 最佳答案 SIGINT 和 SIGSTOP 会暂停子进程吗? 不会,SIGINT 的默认操作是终止进程而不是暂停。虽然 SIGSTOP
我正在尝试编写一个 C 程序,其中父进程挂起子进程并在几秒钟后继续执行它。 #include #include #include #include void sigstop(); void s
我有一个启动 4 个其他二进制文件的 shell 脚本。我正在向 shell 脚本发送 SIGSTOP。这也会停止所有其他 4 个进程吗?如果不是,我应该怎么做才能将 SIGSTOP 转发给这些进程?
当我从父级调用 kill(Child_PID, SIGSTOP); 时,我希望子级停止执行而父级继续。这是预期的行为还是我必须在 child 中明确声明 SIGSTOP 处理程序?我到处搜索,但找不到
我想知道 SIGSTOP 在 Linux 内核中是如何工作的。它是如何处理的?以及内核如何在处理时停止运行? 我熟悉内核代码库。所以,如果你能引用内核函数就好了,事实上这就是我想要的。我不是在从用户的
Docker docs请注意以下有关如何运行 clean up 的(带代码)在容器关闭时: Lastly, if you need to do some extra cleanup ... on sh
所以我有一个很好的合作PTRACE_TRACEME由 PTRACE 处理的子程序包装程序。 问题是如果管理员(或其他)决定 SIGSTOP子程序,我该如何处理?并拿起SIGCONT后来,当然。 答案可
假设我有一个父进程和一个子进程(以例如 fork() 或 clone() 启动)在 Linux 上运行。进一步假设存在一些父子都可以修改的共享内存。 在父进程的上下文中,我想停止子进程并知道它实际上已
我有一些 Python 代码使用 threading.Timer 来实现 60 秒的操作超时。 问题在于此代码在作业控制环境中运行,在该环境中它可能会被更高优先级的作业抢占。在这种情况下,它将发送 S
我知道 /sbin/init 出于显而易见的原因对来自内核的 SIGKILL 和 SIGSTOP 进行了特殊保护。 我已经尝试通过 ioctl() 告诉内核我想接收 SIGSTOP(类似于 SIGAB
我正在停止从另一个 C 程序运行的 shell 脚本。代码如下:杀死(pid,SIGSTOP);我想知道该 shell 脚本停止是否有任何与内核相关的延迟。 换句话说,SIGSTOP 停止另一个进程的
我是一名优秀的程序员,十分优秀!