关于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, 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结构。完成所定义的信号分三类:必需的信号;任务控制信号;内存保护信号,分别如下表:
必需信号
作业控制信号
内存保护信号
每一个进程有一个进程标记(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是遵守了这些规定。
信号处理机制在很早的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 | 获取内存中不确定的部分 |
函数控制这个进程标记的行为。
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是遵守了这些规定。
相关文章推荐
- 关于POSIX标准下的Pthread函数不能使用errno变量的验证
- QT中关于信号与槽机制的实现原理
- 关于linux信号的blog
- 关于 PHP 的标准输入
- Qt5 中关于信号槽的改动
- 关于Solr6.3标准分词源码分析一(如何改动源码,达到分词特殊符号的功能)
- 关于FIFO之半满信号
- 关于SIGPIPE信号
- 关于屏幕的尺寸标准(CSS布局)
- 关于微软公有云Azure会计标准
- 关于微软公有云Azure的计费标准
- 关于Linux中的SIGABRT信号
- 关于印发北京市限价商品住房申购家庭收入、住房和资产准入标准及已购限价商品住房上市交易补交比例的通知
- 关于账户优化的一些标准
- DICOM-RT:DICOM3.0标准中关于放疗的基本知识点
- Bug系列------关于进程信号传递的competion
- 关于qt的信号槽机制的理解
- <心跳连接一>关于信号有关的APUE和SIGALRM信号实例
- 关于SIGPIPE信号
- 关于流文件输出cout与标准输出函数printf的区别