信号的概念-hds ams 2500用户手册
在讨论信号概念之前,了解一些基础知识非常重要。信号是进程间通信的一种手段,通常用于通知某个进程发生了特定的事件。每个信号都有一个独特的名字,这些名字通常以三个字符SIG开头。SIGABRT信号会在进程调用abort函数时产生,而SIGALRM信号则是在由alarm函数设置的时间到期后产生。
你知道吗?在不同的操作系统中,信号的数量也有所不同。V7系统有15种不同的信号,而SVR4和4.3+BSD系统则各有31种信号。在C语言的头文件
当用户在终端上按某些特定键时,会触发信号。在终端上按DELETE键通常会产生中断信号(SIGINT),这是一种终止失控程序的常见方法。你是否知道,这些信号可以被映射为终端上的任何字符?更多详情将在第11章中说明。
硬件异常也是信号的常见来源,例如除数为0或无效存储访问等情况。这些异常通常由硬件检测到,并通知内核。内核随后会向发生异常的进程发送适当的信号,向执行无效存储访问的进程发送SIGSEGV信号。想深入了解这些异常和信号的关系吗?请参考这篇信号量邮箱和消息队列事件异步信号管道的文档。
进程也可以使用kill函数向另一个进程或进程组发送信号。当然,这需要满足一些条件:接收信号的进程和发送信号的进程的所有者必须相同,或者发送信号的进程的所有者必须是超级用户。用户还可以使用kill命令将信号发送给其他进程,这是一种终止失控后台进程的常用方法。详细说明可以在POSIX系统多线程编程指导中找到。
软件条件的发生也会产生信号,但这不同于硬件异常。当检测到某种软件条件(如SIGURG,网络连接上传来非规定波特率的数据,或者SIGPIPE,当管道的读进程已终止后一个进程写此管道)时,信号将被发送给相关进程。这些信号事件是异步的,进程无法通过测试变量(如errno)来判别信号的发生,而是必须告诉内核如何处理这些信号。