- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
APUE 说
Since the process group is orphaned when the parentterminates, POSIX.1 requires that every process inthe newly orphaned process group that is stopped (as our child is) be sent the hang-up signal (SIGHUP)followed by the continue signal (SIGCONT)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#define errexit(msg) do{ perror(msg); exit(EXIT_FAILURE); } while(0)
static void sig_hup(int signo)
{
printf("SIGHUP received, pid = %d\n", getpid());
}
static void sig_cont(int signo)
{
printf("SIGCONT received, pid = %d\n", getpid());
}
static void sig_ttin(int signo)
{
printf("SIGTTIN received, pid = %d\n", getpid());
}
static void pr_ids(char *name)
{
printf("%s: pid = %d, ppid = %d, pgrp = %d, tpgrp = %d\n",
name, getpid(), getppid(), getpgrp(), tcgetpgrp(STDIN_FILENO));
}
int main(int argc, char *argv[])
{
char c;
pid_t pid;
setbuf(stdout, NULL);
pr_ids("parent");
if ((pid = fork()) < 0) {
errexit("fork error");
} else if (pid > 0) { /* parent */
sleep(5);
printf("parent exit\n");
exit(0);
} else { /* child */
pr_ids("child...1");
signal(SIGCONT, sig_cont);
signal(SIGHUP, sig_hup);
signal(SIGTTIN, sig_ttin);
kill(getpid(), SIGTSTP);
//sleep(10);
pr_ids("child...2");
if (read(STDIN_FILENO, &c, 1) != 1) {
printf("read error from controlling TTY, errno = %d\n",
errno);
}
printf("child exit\n");
}
exit(0);
}
程序输出:
parent: pid = 2036, ppid = 1959, pgrp = 2036, tpgrp = 2036
child...1: pid = 2037, ppid = 2036, pgrp = 2036, tpgrp = 2036
parent exit
xiejingfeng@xiejingfeng-desktop:/codes/apue$ SIGCONT received, pid = 2037
SIGHUP received, pid = 2037
child...2: pid = 2037, ppid = 1, pgrp = 2036, tpgrp = 1959
read error from controlling TTY, errno = 5
child exit
输出并不像书上说的那样,因为程序首先接收到 SIGCONT
然后是 SIGHUP
,这让我很困惑,你们能帮帮我吗?
提前致谢。
最佳答案
SIGHUP
在 child 的执行恢复之前无法传递。当进程停止时,除了 SIGCONT
和 SIGKILL
之外的所有信号传递都将暂停。
因此,SIGHUP
确实先到了,但是直到SIGCONT
唤醒进程执行后才能处理。
关于c - SIGCONT 和 SIGHUP 命令发送到孤立的 linux 进程组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17768459/
从另一个终端运行 kill -SIGCONT pid 后,以下过程不会继续。 #include int main(int argc, char *argv[]) { printf("paus
我知道 SIGCONT 继续之前被 SIGSTOP 停止的进程。我可以在没有 SIGSTOP 的情况下多次使用 SIGCONT 吗?即,以下顺序是否有效? SIGSTOP to process A :
我正在编写一个简单的 Linux shell,我想知道是否可以通过向它发送 SIGCONT 信号来将后台作业置于前台。 最佳答案 您可以通过向进程发送 SIGSTOP 来卡住进程并通过发送 SIGCO
您能解释一下UNIX信号系统的逻辑吗:尽管SIGHUP的主要思想是“杀死你自己,不再有终端了”,但它首先向进程组发送SIGHUP信号,然后发送SIGCONT信号? 最佳答案 如果进程因 SIGSTOP
这是我的代码,忽略SIGCONT: int main() { signal(SIGCONT, SIG_IGN); while(1); } 是这样的: > ./main & [1] 25
这是我的代码,忽略SIGCONT: int main() { signal(SIGCONT, SIG_IGN); while(1); } 是这样的: > ./main & [1] 25
我想使用 SIGTSTP(或 SIGSTOP)暂停一个进程,稍后使用 SIGCONT 恢复它。 SIGTSTP 和 SIGSTOP 按预期工作,但 SIGCONT 有时不会唤醒已停止的进程。 例如:S
我正在尝试移植依赖于 SIGCONT 的代码来停止应用程序的某些线程。对于当前的 linux nptl 实现,似乎不能依赖 2.6.x 内核中的那个。我正在尝试设计一种方法来停止其他线程。目前我只能考
我正在尝试复制一个 shell 环境。以下代码在 os.StartProcess 和 p.Wait() 中运行。它能够接收 C-z (SIGTSTP) 和 C-c (SIGINT) 但当我使用 kil
我正在研究信号:特别是 SIGSTOP 和 SIGCONT。这是我写的一个测试程序。这个想法是创建一个 N + 1 的链进程(包括主进程)。每个人都必须等待它的 child 停止,然后停止本身。当后者
我目前正在用 C 编写一个简单的 shell,但我遇到了信号问题。 例如,当我启动我的程序时,我输入 ping 命令,然后 CTRL-Z 我希望子进程(ping 命令)暂停,然后在我使用 fg 时返回
所以我有一个很好的合作PTRACE_TRACEME由 PTRACE 处理的子程序包装程序。 问题是如果管理员(或其他)决定 SIGSTOP子程序,我该如何处理?并拿起SIGCONT后来,当然。 答案可
我有一些 Python 代码使用 threading.Timer 来实现 60 秒的操作超时。 问题在于此代码在作业控制环境中运行,在该环境中它可能会被更高优先级的作业抢占。在这种情况下,它将发送 S
我正在使用 PTRACE_SEIZE 来跟踪子进程的执行,但我遇到了一个问题,即非组停止 PTRACE_EVENT_STOP(信号 = = SIGTRAP) 当被跟踪者收到一个 SIGCONT 时被发
我会尽量保持简单。我目前正在为 LINUX 复制一个 shell。我使用链表结构“job_list”来存储所有后台进程。如果后台进程终止,则将其从列表中删除。如果后台进程被挂起,其在列表中的状态将从
APUE 说 Since the process group is orphaned when the parentterminates, POSIX.1 requires that every pr
我正在编写一个 C 程序,该程序将 fork()、execvp() 用于子进程。我想停止、继续并终止子进程,我该如何处理?我不太了解信号。 最佳答案 调用signal进程中的函数以设置信号处理程序,该
我正在用 C 语言创建自己的 shell。到目前为止,我实现了许多功能,但我遇到的问题是 CTRL-Z 处理 (SIGTSTP)。让我详细说明成功尝试的问题: 当我在 shell 中执行程序(如 ge
在被指向一个新功能后,我为自己构建了一个 gdb 7.0 版本,并且碰巧它还在我的道路上。 尝试逐步执行一些新代码,我添加了一个 pause() 调用,希望能够像这样退出: (gdb) b 5048B
当执行进程并使用以下方式向其发送信号时:Process.Signal我注意到在发送第二个信号 syscall.SIGCONT 之后我得到了一个:os: process already finished
我是一名优秀的程序员,十分优秀!