gpt4 book ai didi

c - 为什么信号处理程序不处理信号

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:41 25 4
gpt4 key购买 nike

我正在尝试制作一个模拟命令 nohup 的程序。该程序作为第一个参数获取,即要执行的命令的名称。当终端关闭时,我的程序执行的程序不得通知,它将不得不忽略 SIGHUP。如果我使用以下命令测试我的程序:

         ./mynohup sleep 120 &

然后我尝试从另一个终端发送 SIGHUP, sleep 在它应该免疫时终止。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

#include <signal.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>

#include "utils.h"

#define NOHUP_OUT_FILE "nohup.out"

static void handle_signal(int signum)
{
if(signum == SIGHUP)
{
printf("This is ignored\n");
}
else
{
printf("Not ignored\n");
}
fflush(stdout);
}

/* configure handlers */
static void set_signals(void)
{
struct sigaction sa;
int rc;

/* TODO - ignore SIGHUP */
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_handler = handle_signal;
rc = sigaction(SIGHUP, &sa, NULL);

DIE(rc == -1, "sigaction");

}

/* execute a new program */
static void exec_func(int argc, char **argv)
{
int rc;
int i;
char **exec_args;
int fd;

set_signals(); /* ignore SIGHUP */

if(isatty(STDOUT_FILENO))
{
fd = open(NOHUP_OUT_FILE, O_WRONLY | O_CREAT | O_TRUNC, 0644);
DIE(fd < 0, "open");

dup2(fd, STDOUT_FILENO);
close(fd);
}

/* exec a new process */
exec_args = malloc(argc * sizeof(*exec_args));
DIE(exec_args == NULL, "malloc");

for (i = 0; i < argc-1; i++)
exec_args[i] = argv[i+1];
exec_args[argc-1] = NULL;

execvp(exec_args[0], exec_args);
DIE(1, "execvp");
}

int main(int argc, char **argv)
{
if (argc <= 1) {
fprintf(stderr, "Usage: %s command_and_arguments\n", argv[0]);
exit(EXIT_FAILURE);
}

exec_func(argc, argv);

return 0;
}

我试图跳过创建新进程的步骤,信号处理程序运行良好。如果信号处理程序采用以下形式,则程序可以运行

static void set_signals(void)
{
struct sigaction sa;
int rc;

/* ignore SIGHUP */
memset(&sa, 0, sizeof(sa));
sa.sa_handler = SIG_IGN;

rc = sigaction(SIGHUP, &sa, NULL);
DIE(rc == -1, "sigaction");
}

我不明白为什么当我创建信号处理程序的第一个版本时程序无法运行,而第二个版本却可以运行。

提前致谢!

最佳答案

所有 exec 函数都会将捕获信号的配置重置为其默认配置。

当你执行时,你的进程镜像被销毁并被新程序的进程镜像取代。在其中,指向您传递给 sigaction 的 handle_function 的指针不再具有意义,或者至少是旧的意义。操作系统可以对 execve 上处理的信号做的唯一明智的事情是重置它们。

SIG_IGN 的含义是通用的,独立于当前程序,这就是为什么 SIG_IGN 可以而且确实是被继承的原因。

关于c - 为什么信号处理程序不处理信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56618559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com