当前位置: 首页 > 知识库问答 >
问题:

Fork()带有信号的子进程

慕飞章
2023-03-14

我必须分叉两个子进程,其中SIGINT命令被阻塞,但其中一个在接收到SIGTERM信号时应该解除阻塞,而另一个子进程和父进程都会打印它们的PID,作为相同SIGTERM信号的结果。第二个子进程应立即终止,但父进程应等待其子进程结束,然后停止。

我刚开始在Linux中学习C编程,但我并不真正理解分叉和信号是如何工作的。据我所知,我编写的这段代码将派生一个进程,子进程将阻止Ctrl-C命令,整个过程将永远运行,除非我使用kill-9PID终止它。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void handler(int n) {
    write(STDOUT_FILENO, "I won't die!! Haha\n",13);
}

int main()
{
    pid_t pid = fork();
    if (pid < 0) {
        perror("Fork() error!");
        exit(-1);
    }
    if (pid == 0)
        signal(SIGINT,handler);
    while(1) {
        printf("Wasting the iteration. %d\n", getpid());
        sleep(1);
    }
    return 0;
}
  • 如何使用SIGTERM?我应该在哪里调用它?
  • 如何让父进程创建另一个阻止Ctrl-C命令的子进程?

共有1个答案

范承望
2023-03-14

不确定是否分叉多个进程,因为我从未这样做过。就SIGTERM而言,您需要一个回调来处理终止信号。以下是我在我编写的许多服务中使用的一个:

/***************************************************************************************************
 * Function signal_callback_handler - allows for a graceful shutdown process.
 * *************************************************************************************************/
void signal_callback_handler(int signum) {
    //here we receive some sort of notification to terminate.
    //Log this event and change the state of the process control variable
    //so that the main processing loop knows to stop
    syslog(LOG_NOTICE, "Recived signal to shutdown - Signal %d", signum);
    //put code here to do preshutdown clean up, terminating threads, etc....
}

然后,需要为每个要处理的终止信号注册回调。以下是我在使用fork之前在main函数中放置的函数:

if (signal(SIGINT, signal_callback_handler) == SIG_ERR) {
    syslog(LOG_CRIT, "An error occurred while setting SIGINT signal handler.");
    return(EXIT_FAILURE);
}
if (signal(SIGUSR1, signal_callback_handler) == SIG_ERR) {
    syslog(LOG_CRIT, "An error occurred while setting SIGUSR1 signal handler.");
    return(EXIT_FAILURE);
}
if (signal(SIGUSR2, signal_callback_handler) == SIG_ERR) {
    syslog(LOG_CRIT, "An error occurred while setting SIGUSR signal handler.");
    return(EXIT_FAILURE);
}
if (signal(SIGTERM, signal_callback_handler) == SIG_ERR) {
    syslog(LOG_CRIT, "An error occurred while setting SIGTERM signal handler.");
    return(EXIT_FAILURE);
}
if (signal(SIGTSTP, signal_callback_handler) == SIG_ERR) {
    syslog(LOG_CRIT, "An error occurred while setting SIGTSTP signal handler.");
    return(EXIT_FAILURE);
}
 类似资料:
  • 父进程定时器回调函数中fork,子进程execl,子进程无法接收到SIGALRM信号 父进程代码 子进程代码 子进程一直pause,通过命令行kill发送SIGALRM信号,STRACE监控,子进程没有接收到信号

  • 问题内容: 我知道fork()对于子进程和父进程返回的结果有所不同,但是我无法找到有关此情况的信息。子进程如何从fork接收返回值0?在调用堆栈方面有什么区别?据我了解,对于父母来说,是这样的: 父进程-调用fork-> system_call-调用fork-> fork执行-返回-> system_call-返回->父进程。 在子进程中会发生什么? 问题答案: %人叉 返回值 indi- cat

  • 问题内容: 我分叉了多个流程,我想衡量完成整个任务需要多长时间,即所有分叉的流程都完成了。请告知如何使父进程等待所有子进程终止?我想确保在正确的时间停止计时器。 这是我使用的代码: 问题答案: 我将在“ else // parent”行之后的所有内容都移到for循环之外。在分叉循环之后,使用waitpid进行另一个for循环,然后停止计时并执行其余操作: 我假设如果子进程无法正常退出且状态为0,则

  • 从父进程派生出子进程,子进程完全拷贝父进程的stack,data,heap segment。 两者并不共享地址空间,所以的变量是独立的,一方修改,另一方不会变化。 函数原型 #include <unistd.h> pid_t fork(void); 特点 一次调用,两次返回

  • 问题内容: 假设我创建了一个信号量。如果我派生了一堆子进程,它们还会使用相同的信号量吗? 另外,假设我创建了一个内部带有信号灯并分叉的结构。所有子进程仍然使用相同的信号量吗?如果不是,将struct + semaphores存储在共享内存中是否允许子进程使用相同的信号量? 我对派生的子进程如何使用相同的信号量感到非常困惑。 问题答案: 假设我创建了一个信号量。如果我派生了一堆子进程,它们还会使用相

  • 进程的管理主要是指进程的关闭与重启。我们一般关闭或重启软件,都是关闭或重启它的程序,而不是直接操作进程的。比如,要重启 apache 服务,一般使用命令"service httpd restart"重启 apache的程序。 那么,可以通过直接管理进程来关闭或重启 apache 吗?答案是肯定的,这时就要依赖进程的 信号(Signal)了。我们需要给予该进程号,告诉进程我们想要让它做什么。 系统中