linux - UNIX 中的陷阱命令

标签 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不会执行。

最佳答案

这就是信号在 UNIX 中的工作方式。当您通过按 ctrl + C 发送 SIGINT 时,将调用信号处理程序,即在您的情况下,调用 main 函数。但是当处理程序正在处理信号时,所有后续信号都将阻塞,直到处理程序返回。在您的情况下,处理程序永远不会返回。因此,在处理程序返回之前,您的程序无法对后续的 SIGINT 信号使用react。递归调用信号处理程序不是一个好主意,信号处理程序也不应该做太多的工作。它应该处理信号并尽快返回。

此外,请注意定义的宏名称(例如 SIGINT)应该用于比实际数字更好的可移植性。您可以使用 kill -ltrap -l 命令获取列表。

关于linux - UNIX 中的陷阱命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30976548/

相关文章:

c - 将程序输出重定向到我的程序

linux - 我如何知道我是否在运行嵌套 shell?

shell - Rsync 仅创建符号链接(symbolic link)

c - 管道、子进程和子进程的范围

c - 如何从 C 中的父进程分离 fork 进程

c++ - 使用反引号时程序不输出

linux - dns 不能在嵌入式设备上工作?

没有分隔符的列上的 unix 排序

c - 如何从 root 使用 setuid() 成为用户,以后有可能再次成为 root?

shell - FFMPEG 执行非常缓慢