gpt4 book ai didi

linux - bash 信号陷阱将覆盖其 nohup 子命令的信号?

转载 作者:太空狗 更新时间:2023-10-29 11:07:42 26 4
gpt4 key购买 nike

今天遇到一个问题,shell脚本启动的程序收不到INT信号。经过一番调查后,我将在下面展示我的发现。

这是我要运行的目标程序,我用gcc hello.c -o hello.out编译它如果你手动启动这个程序,你可以通过kill停止它-2

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


int main()
{
while (1) {
printf("--------Hello Wolrd!\n");
sleep(2);
}
return 0;
}

然后我有一个 shell 脚本,它在启动我的程序之前进行一些处理。这是简洁的版本,我们称它为 trap.sh:

#!/bin/bash

pid=0

function singal_handler() {
echo "pid is "$java_pid
}

trap "singal_handler" INT

pid=2

nohup ./hello.out &

while true; do
echo "running...."
sleep 2
done

请注意,我使用 trap 捕获 INT 信号来完成我自己的工作,并使用 nohup 启动我的 hello.out

现在我通过 bash trap.sh 启动我的程序。

通过向我的 trap.sh 发出 kill -2,该行为是预期的,pid 输出已输出。

令我惊讶的是,此时,当我向我的后台hello.out发出kill -2时,hello.out还在那里,不会消失。

所以我写这个问题是想问为什么会这样。 bash trap 将覆盖其子命令的信号处理程序?

我的平台是 64 位 linux:

uname -r -----> 3.10.0-123.el7.x86_64

谢谢。

最佳答案

bash manual说:

When a simple command other than a builtin or shell function is to be executed, it is invoked in a separate execution environment that consists of the following. Unless otherwise noted, the values are inherited from the shell.

  • the shell’s open files, plus any modifications and additions specified by redirections to the command
  • the current working directory
  • the file creation mode mask
  • shell variables and functions marked for export, along with variables exported for the command, passed in the environment (see Environment)
  • traps caught by the shell are reset to the values inherited from the shell’s parent, and traps ignored by the shell are ignored

man sigaction说:

A child created via fork(2) inherits a copy of its parent's signal dispositions. During an execve(2), the dispositions of handled signals are reset to the default; the dispositions of ignored signals are left unchanged.

所以是的,SIGINT 被忽略了,因为父 shell 忽略了它。

关于linux - bash 信号陷阱将覆盖其 nohup 子命令的信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38588930/

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