trap命令如何在此代码中起作用?
trap "ignore" 2
ignore()
{
main
}
main()
{
trap "main" 2
while [ 1 ]
do
echo -e "\t\t\t1.Add\n\t\t\t2.Remove\n\t\t\t3.Edit\n\t\t\t4.Search\n\t\t\t5.Display\n\t\t\t6.Exit"
echo "Enter the option"
read option
case $option in
1)echo "You take add option";;
2)echo "You take Remove option";;
3)echo "You take Edit option";;
4)echo "You take Search option";;
5)echo "You take Display option";;
6)exit;;
*)echo "Invalid Option"
esac
done
}
main
如果执行上述脚本,则捕获ctrl + c信号并调用main函数。但是,它只在时间(第一次)完成。它在第二次不起作用。在第一次使用ctrl + c时,将调用main。但是,这只能工作一次。在ctrl + c的第二次,main将不会被执行。
答案 0 :(得分:4)
这就是UNIX中信号的工作方式。当您通过按 ctrl + C 发送SIGINT时,将调用信号处理程序,即在您的情况下,var allFields = commonButtons.concat(extraFields);
for (var i = 0; i < allFields.length; i++) {
var node = document.createElement("input");
var btName = document.getElementById("submit-buttons");
node.setAttribute('data-value', allFields[i]);
node.setAttribute('class', "submitButton");
node.setAttribute('type', "submit");
node.setAttribute('id', "test");
node.setAttribute('name', "");
node.setAttribute('value', allFields[i]);
var parent = document.getElementById('submit-buttons');
parent.insertBefore(node, parent.childNodes[parent.childNodes.length - 2]);
}
函数。但是当处理程序处理信号时,所有后续信号都被阻塞直到处理程序返回。在您的情况下,处理程序永远不会返回。因此,在处理程序返回之前,程序无法对后续的SIGINT信号做出反应。以递归方式调用信号处理程序并不是一个好主意,信号处理程序也不应该做太多的工作。它应该处理信号并尽快返回。
另请注意,定义的宏名称(例如main
)应该用于比实际数字更好的可移植性。您可以使用SIGINT
或kill -l
命令获取列表。