您的位置:首页 > 其它

关于POSIX标准中的信号

2014-01-27 15:53 330 查看
      在看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时,先前的信号标记被存储在它所指向的地方,如果参数set为null,则参数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是遵守了这些规定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: