- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
所以我正在尝试在子进程中为 SIGTSTP 信号实现信号处理程序。
基本上我想要实现的是:
我使用命令运行它:./testsig sleep 10
到目前为止,这是我的代码:
#include<stdlib.h>
#include<stdio.h>
#include<signal.h>
#include<string.h>
volatile sig_atomic_t last_proc_stopped;
volatile sig_atomic_t parent_proc_id;
void handle_stp(int signum)
{
if(getpid()==parent_proc_id)
{
kill(parent_proc_id,SIGCONT);
signal(SIGTSTP,handle_stp);
}
else
{
last_proc_stopped=getpid();
kill(parent_proc_id,SIGCONT);
}
}
void main(int argc, char *argv[])
{
int childid=0,status;
signal(SIGTSTP,SIG_IGN);
parent_proc_id=getpid();
childid=fork();
if(childid>=0)
{
if(childid==0)//child
{
signal(SIGTSTP,handle_stp);
strcpy(argv[0],argv[1]);
strcpy(argv[1],argv[2]);
argv[2]=NULL;
printf("Passing %s %s %s\n",argv[0],argv[1],argv[2]);
execvp(argv[0],argv);
}
else
{
wait(&status);
printf("Last Proc Stopped:%d\n",last_proc_stopped);
}
}
else
{
printf("fork failed\n");
}
}
目前ctrl+Z好像有点效果(但绝对不是我想要的!)
当我在子进程执行 sleep 的过程中按 ctrl+Z 键时,光标会继续闪烁剩余的时间(在我的例子中是 10 秒),但控制不会到达父进程。
在不按 ctrl+Z 的情况下,控制权会按预期返回到父级。
我做错了什么?
我也看到了这个答案,但是我不是很理解:
After suspending child process with SIGTSTP, shell not responding
最佳答案
你有两个进程:
忽略信号的父级,
设置处理程序的子进程,然后执行另一个进程 - 这将从内存中清除信号处理程序的代码(执行的程序将加载到调用进程的位置),因此也将清除信号设置也是如此。因此,您的信号处理函数将永远不会被调用。 Is it possible to signal handler to survive after “exec”?
你可以做什么来实现你的目标?
家长应该忽略这个信号,
child 应该保留默认的信号处理(这会停止它),
parent 应该使用waitpid()
查看子进程是否退出或停止,并采取相应行动(这涉及实际杀死停止的子进程)。
关于c - 子进程的 SIGTSTP 信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26371610/
我的目标:我有一个简单的 c 程序,它应该用我自己的覆盖默认的 SIGTSTP 处理程序,并且只向子进程发送 SIGTSTP。 我的问题:SIGTSTP 处理程序中的 kill 调用会停止父进程,并退
我正在尝试为正在运行的前台进程安装 CTRL-Z (SIGTSTP) 处理程序。 我在 sigaction 之前设置了处理程序 ( wait )在父级。这是正确的地方吗?好像不太行。。 编辑: 我正在
我用 C 写了一个程序,我需要处理 ctrl + z 和相应的信号 SIGTSTP 和 SIGCONT。 接收到信号后我的变量和进程会发生什么变化? 通过信号处理程序 signal(SIGCONT,
我正在尝试编写一个 fork 的程序,子进程执行一个命令,然后将控制权返回给父进程。不过,我无法让 SIGTSTP (C-z) 信号按预期工作......我希望 parent 忽略它,但 child
我正在研究一个问题,以查找给定链表中循环(如果有)中存在的节点数。下面是接受节点头的函数,使用 Floyds 循环算法检查循环,如果找到,则给出循环中的节点数。在运行程序时,它会给出运行时错误 SIG
我正在尝试向子进程发送 SIGTSTP 信号。我面临的问题是向子进程发送 SIGTSTP 会停止我的整个程序,并且调用者无法继续执行程序的其余部分。这是我的代码 cmd := exec.Command
所以我正在尝试在子进程中为 SIGTSTP 信号实现信号处理程序。 基本上我想要实现的是: 启动子进程 让父进程等待子进程 在子进程上调用 Sleep x 秒。 在 sleep 结束执行之前,我想发送
只是想知道 SIGSTOP 和 SIGTSTP 信号之间的区别。 最佳答案 这两个信号都旨在挂起一个进程,该进程最终将通过 SIGCONT 恢复。它们之间的主要区别是: SIGSTOP 是以编程方式发
我用 C 编写了一个 shell,它确实具有一些基本功能。我在我的程序中实现了“仅前景模式”,该模式通过 SIGTSTP 或 CTRL-Z 进行切换。但是,我能够捕获 CTRL-Z 信号,但不能捕获
我对它们中的每一个都有两个处理程序(SIGTSTP、SIGCHLD),问题是当我使用 SIGTSTP 暂停进程时,SIGCHLD 的处理函数也会运行。我应该怎么做才能防止这种情况发生。 信号处理程序:
我正在制作一个小的shell程序。我想在sigtstp_handler中暂停前台程序。和sigchld_handler来获取zombie 。但是当我输入 ctrl z 时,即使我没有前台程序,sigc
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is EOF in the C programming language? 当我学习 K&R C
我在学习中遇到了这个示例代码: #include #include #include char* nums[5] = {"One", "Two", "Three", "Four", "Five"
简而言之,问题陈述:LSF 中是否有一种方法可以将信号 SIGCONT/SIGTSTP 传递给作业中运行的所有进程? 我有一个在 LSF(版本 9.1.2)上运行的 Perl 包装器脚本,并在与 Pe
我正在用 C 编写一个基本的 shell,我现在正致力于暂停一个子进程。 我认为我的信号处理程序是正确的,我的子进程正在挂起,但在那之后,终端应该返回到父进程,而这并没有发生。 child 被挂起,但
我正在用 C 编写一个基本的 shell,我现在正致力于暂停一个子进程。 我认为我的信号处理程序是正确的,我的子进程正在挂起,但在那之后,终端应该返回到父进程,而这并没有发生。 child 被挂起,但
我在 gdb 中运行 vlc 并使用 ^Z 中断它(因为 ^C 不起作用)。在检查了一些堆栈帧和变量后,我尝试使用“cont”来恢复程序,但它一直给我 Program received signa
在 Linux 中有两种不同的信号可用于暂停进程,SIGSTOP 和 SIGTSTP。两者均未由 HotSpot 虚拟机 处理,SIGSTOP 因为无法捕获和SIGTSTP because is no
我有一个安装和卸载设备的 bash 脚本,它在两者之间执行一些读取操作。由于设备非常慢,脚本大约需要 15 秒才能完成(挂载至少需要 5-6 秒)。由于挂载此设备会导致其他问题,因此我不希望此脚本被中
我正在赶时间完成一项编程任务,在这项任务中,我必须同时在同一台机器上运行同一程序的多个实例。目前,我一次启动一个实例,按 Ctrl+z 暂停它们,然后执行 'bg %#' 以在后台恢复执行。 每次我需
我是一名优秀的程序员,十分优秀!