关于POSIX标准中的信号

来源:互联网 发布:sql指定的账户已存在 编辑:程序博客网 时间:2024/06/06 19:29

      在看linux0.11代码注释当中的signal.c中,有一些关于POSIX的描述:


信号处理机制在很早的UNIX系统中就已经有了,但那些早期UNIX内核中信号处理的方法并不是那么可靠。信号可能会被丢失,而且在处理紧要区域代码时进程有时很难关闭一个指定的信号,后业POSIX提供了一种可靠处理信号的方法。为保持兼容性,本程序中还是提供了两种处理信号的方法。

在内核代码中通常使用一个无符号长整形(32位)中的比特位来表示各种不同的信号。因此最多可表示32个不同的和谐号。在本版本linux内核中,定义了22种不同的信号。其中20种信号是POSIX.1标准中规定的所有信号,另外2种是linux的专用信号:SIGUNUSED和SIGSTKFLT,前者可表示系统目前还不支持的所有其他信号种类。...


因为POSIX这个标准在很多场合都出现,我觉得有必要弄清楚这到底是一个什么样的东西!我得到的大概了解是规定了一些操作系统必须实现的通用接口,以方便可移植性。但不是每个操作系统都严格遵守这个标准。从这些内容,我加深了解到linux中实现的一些函数,原来都是遵守这个标准而做的。包括进程,时间,信号等,都可以在POSIX上找到标准的规定!

以下描述来自的资料:http://en.wikipedia.org/wiki/POSIX ;http://blog.csdn.net/novagx/article/details/2077561;

内容太多了,摘一些下来:

可移植操作系统界面英语:Portable Operating System Interface,缩写为POSIX),是IEEE为要在各种UNIX操作系统上运行的软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承。

Linux基本上逐步实现了POSIX兼容,但并没有参加正式的POSIX认证。[来源请求]

微软的Windows NT声称部分实现了POSIX标准。[来源请求]

当前的POSIX主要分为四个部分[1]:Base Definitions、System Interfaces、Shell and Utilities和Rationale。

POSIX.1[edit]

  • POSIX.1, Core Services (incorporates Standard ANSI C) (IEEE Std 1003.1-1988)
    • Process Creation and Control
    • Signals
    • Floating Point Exceptions
    • Segmentation / Memory Violations
    • Illegal Instructions
    • Bus Errors
    • Timers
    • File and Directory Operations
    • Pipes
    • C Library (Standard C)
    • I/O Port Interface and Control
    • Process Triggers

3.3 信号
在头文件<signal.h>终声明了sigset_t类型和sigaction结构。完成所定义的信号分三类:必需的信号;任务控制信号;内存保护信号,分别如下表:
必需信号
符号常量
描述
SIGABRT非正常终止信号SIGALRM超时信号SIGFPE错误运算操作SIGHUP为控制中断所检测到的挂断SIGILL无效硬件信号的检测SIGINT交互式信号SIGKILL终止信号SIGPIPE写信号SIGQUIT交互式终止信号SIGSEGV无效内存引用检测信号SIGTERM终止信号SIGUSR1保留信号SIGUSR2保留信号
作业控制信号
符号常量
描述
SIGCHLD子进程终止或停止SIGCONT停止后继续SIGSTOP停止信号SIGTSTP交互式的停止信号SIGTTIN从控制终端读SIGTTOU写到控制终端
内存保护信号
符号常量
描述
SIGBUS获取内存中不确定的部分
每一个进程有一个进程标记(process mask),它定义了一组产生但被阻塞传递的信号集。Sigaction(),sigpromask(),sigsuspend()
函数控制这个进程标记的行为。
1.送一个信号到进程
函数原型:#include <sys/types.h>
          #include<signal.h>
          int kill(pid_t pid, int sig)
函数功能:该函数发送一个信号到一个由pid指明的进程或者进程组,sig标志了信号类型,其值是0或者上表中的值。如果发送成功,返回‘0’,否则返回‘1’。
2. 操纵信号集
 函数原型:#include<signal.h>
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigisemeber(const sigset_t *set,int signo);
 函数功能:sigsetops源语操纵信号集。他们操作以数字为对象,这些数据由应用程序的地址所指向,而不是以系统所知的信号集为对象。
3. 检测和更改信号的行为
 函数原型:#include<signal.h>
            int sigaction(int sig,const struct sigaction *act,struct sigaction *oact);
              函数功能:该函数允许调用函数检查与确定的信号相联系的行为,
                        参数sig确定了信号,sigaction结构在头文件<signal.h>中被定义,描述了所采取的行为。如果参数act不为null,它指向一个结构,它指定了与信号相联系的行为。如果参数oact不为null,先前与信号相联系的行为将被存储到由oact指向的地方。
4. 检查和改变阻塞信号
 函数原型:#include<signal.h>
int sigprocmask(int how,xonst sigset_t *set,sigset_t *oset);
 函数功能:该函数用来检查和改变调用进程的信号标记(signal mask),如果参数set不为null,它指向一个信号集的用于改变当前的阻塞集。参数how指明了改变方式,参数oset不为null时,先前的信号标记被存储在它所指向的地方,如果参数setnull,则参数how就没有意义了,而且进程的信号标记不能随函数调用而改变。
5. 检查未定的信号
 函数原型:#include<signal.h>
            int sigpending(sigset_t *set);
 函数功能:该函数存储一个信号集,这些信号是在被调用进程传输和未定的情况下阻塞的,由参数set所指向。
6.等待一个信号
 函数原型:#include<signal.h>
             int sigsuspend(const sigset_t *sigmask);
   函数功能:该函数用参数sigmask所指向的信号集取代了进程信号标记(signal mask),然后挂起该进程直到接受到一个信号,其行为是执行信号跟踪功能或者是终止该进程。
7. 同步接受一个信号
 函数原型: #include<signal.h>
             int sigwaitinfo(const sigset_t *set, siginfo_t *info);
             int sigtimedwait(const sigset_t *set,siginfo_ *info, const struct timespec *timeout );
 函数功能:该函数从参数set所确定的信号集中选择一个未定的信号出来。如果该函数成功,返回一个信号数;否则返回-1
8. 排队一个信号到进程
 函数原型:#include<signal.h>
           int sigqueue(pid_t pid,int signo, const union sigval value);
 函数功能:该函数功能是使由signo确定的信号将参数value所确定的值发送到由pid指明的进程中去。

从上面内容看到,正好20个信号规定,linux0.11是遵守了这些规定。

0 0
原创粉丝点击