c - 在 C 中使用 SIGALRM 继续执行已停止的进程
问题描述
工作是继续执行我在收到 SIGALRM 信号时停止的子进程。到目前为止,我做了以下事情,这似乎不起作用:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
void handler(int sig)
{
printf("hello from the handler\n");
kill(getpid(),SIGCONT);
printf("child is continuing executing");
}
int main()
{
int pid1=fork();
signal(SIGALRM,handler);
if (pid1==0) {
kill(getpid(),SIGTSTP);
printf(" I am in the child\n");
} else {
printf("i am in the parent \n");
kill(pid1,SIGALRM);
}
}
我尝试了许多代码变体,但printf("I am in the child");
从未执行过。
解决方案
回复:评论中提出的问题是(“我怎样才能让 kill(pid1,SIGALRM) 向孩子发送信号?”)。该调用kill(pid1,SIGALRM)
确实将信号发送给孩子,但孩子没有响应它,因为它已停止。提出的问题有些模棱两可,因为不清楚“当我收到 SIGALRM 信号时”短语中的“我”指的是谁。如果您想让孩子在孩子收到 SIGALRM 时继续,您不能。您必须先向孩子发送一个 SIGCONT,然后它才会做任何事情。如果您希望孩子在父母收到 SIGALRM 时继续,您可以这样做:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
pid_t pid1;
void handler(int sig)
{
(void)sig;
if( pid1 ) {
kill(pid1, SIGCONT);
}
}
int main(void)
{
signal(SIGALRM, handler);
pid1 = fork();
if( pid1 == 0 ) {
kill(getpid(), SIGTSTP);
printf("Child continued\n");
} else {
alarm(1);
pause();
}
}
推荐阅读
- c# - 如何对两个表使用相同的模型。或 db 最佳实践
- python - 如何将数据从 Web 表写入文件。数值变化很快
- scala - scala spark - 基于可变日期匹配数据帧
- java - 试图通过Tomcat内部的骆驼调用外部HTTP Post请求
- arduino - 几分钟后我的 NodeMCU 和我的 ESP01 都关闭了
- ssh - 从集群内部访问 Vagrant VM(运行 Centos/7 的 Vitualbox)
- java - python和java之间发送短信
- php - 如何使用 MAX 函数中的值来确定下一个可用的 id?
- r - 将另一个矩阵的内容(列表内容)放入矩阵的 NULL 位置
- google-bigquery - 在 bigquery 中创建一个非常大的表的 id 的成对组合