UNIX中的陷阱命令

时间:2015-06-22 09:35:01

标签: linux shell unix signals

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将不会被执行。

1 个答案:

答案 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)应该用于比实际数字更好的可移植性。您可以使用SIGINTkill -l命令获取列表。