我在这里得到了一个奇怪的东西。我有以下环境。
单独的binary和ash脚本都会阻止用户退出。
但请注意以下内容:
错误的地方是:
以下是一个例子:
在C代码中,我们说我有:
void sigintHandler(int sig_num)
{
fprintf(stderr, "You are not allowed to exit this program.\n");
return;
}
void main(void)
{
signal(SIGINT, sigintHandler);
int ret = system("/etc/scripts/test.sh");
printf("test.sh returned: %d exit status.\n", ret);
}
在test.sh中我有:
#!/bin/ash
# Disable interrupts so that one cannot exit shell script.
trap '' INT TSTP
echo -n "Do you want to create abc file? (y/n): "
read answer
if [ $answer == "y" ];then
touch /tmp/abc
fi
if [ -f /tmp/abc ]; then
echo "Returning 1"
exit 1
else
echo "Returning 2"
exit 2
fi
如果我正常运行C二进制文件,我将获得正确的退出状态(1或2),具体取决于文件是否存在。实际上我得到256或512表示它将退出代码存储在第二个字节中。点是每次都能保持一致。
但现在如果我在shell脚本运行时按下Ctrl + C(在回答提出的问题之前)并说我回答" n"这是退出代码2.在C二进制文件中,我得到的代码有时是2(不是512,表示退出代码现在在LOWER字节中)但更常见的是我得到的代码为0!即使我看到消息"返回2"这是由shell脚本回应的。
这让我疯狂地想弄清楚为什么简单的退出代码被搞砸了。
任何人都可以提供一些建议吗?
非常感谢 阿伦
答案 0 :(得分:0)
我发现了这个问题。
以前我使用陷阱''INT TSTP来禁用shell脚本中的中断。虽然这可以防止shell脚本被中止,但这导致了这篇文章中的问题。我怀疑在禁用以这种方式中止shell脚本的能力时,上层shell框架并没有意识到这一点,并且所有它知道的是Ctrl + C或其他什么被按下并返回SIGINT作为退出代码尽管shell脚本本身正在退出。
解决方案是使用:
stty -isig
在shell脚本的开头。
这不仅禁用了中断,而且让上级框架知道这就是你所做的,这样就忽略了按下Ctrl + C的事实。
我在下页找到了这些信息:
https://unix.stackexchange.com/questions/80975/preventing-propagation-of-sigint-to-parent-process
谢谢大家, 阿伦