0
点赞
收藏
分享

微信扫一扫

C Library User 手册(17)

小贴贴纸happy 2022-03-12 阅读 27

C Library User 手册(17)

10.13 signal.h

包括标准头文件<signal.h>以指定程序在执行时如何处理信号。信号可以报告程序中的一些特殊行为,如除以零。或者一个信号可以报告程序外的一些异步事件,如有人敲击键盘上的交互注意键。
你可以通过调用 raise 来报告任何信号。每个实现都定义了它产生的信号(如果有的话)以及在什么情况下产生的信号。一个实现可以定义这里列出的信号以外的信号。标准头文件<signal.h>可以定义额外的宏,名称以SIG开头,以指定额外信号的值。所有这些值都是整数常数表达式0。
你可以为每个信号指定一个信号处理程序。信号处理程序是一个函数,当相应的信号发生时,目标环境会调用它。目标环境会暂停程序的执行,直到信号处理程序返回或调用longjmp。为了获得最大的可移植性,一个异步信号处理程序应该只。
■对函数signal进行调用(成功)。
■向volatile sig_atomic_t类型的对象赋值
■将控制权返回给其调用者
■此外,在C++中,一个信号处理程序应该。
■有外部的 "C "链接
■只使用C和C++共同的语言特性
如果信号在程序中报告了一个错误(并且信号不是异步的),信号处理程序可以通过调用about来终止。
信号处理程序可以通过调用abort、exit或longjmp来终止。


/* MACROS */
#define SIGABRT <integer constant expression >= 0> #define SIGFPE <integer constant expression >= 0> #define SIGILL <integer constant expression >= 0> #define SIGINT <integer constant expression >= 0> #define SIGSEGV <integer constant expression >= 0> #define SIGTERM <integer constant expression >= 0> #define SIG_DFL <address constant expression> #define SIG_ERR <address constant expression> #define SIG_IGN <address constant expression>
/* TYPES */
typedef i-type sig_atomic_t;
/* FUNCTIONS */
int raise(int sig);
void (*signal(int sig, void (*func)(int)))(int);

10.13.1 raise


int raise(int sig);

该函数发送信号sig,如果信号被成功报告则返回0。

10.13.2 sig_atomic_t

typedef i-type sig_atomic_t;

该类型是整数类型i-type,用于对象的存储值被分配运算符改变为原子操作(操作在部分完成时从不暂停执行)。你声明这样的对象是为了在信号处理程序和程序的其他部分之间进行通信。

10.13.3 SIGABRT

#define SIGABRT <integer constant expression >= 0>

该宏产生中止信号的sig参数值。

10.13.4 SIGFPE

#define SIGFPE <integer constant expression >= 0>

该宏产生算术错误信号的sig参数值,如被零除或结果超出范围。
除以零或结果超出范围。

10.13.5 SIGILL

#define SIGILL <integer constant expression >= 0>

该宏产生无效执行信号的sig参数值,例如对于一个
损坏的函数图像。

10.13.6 SIGINT

#define SIGINT <integer constant expression >= 0>

该宏产生异步交互式注意信号的sig参数值。
信号。

10.13.7 signal

void (*signal(int sig, void (*func)(int)))(int);

该函数指定了信号sig的新处理方式,并返回以前的处理方式。
如果成功,则返回先前的处理方式;否则,返回SIG_ERR。
■如果func是SIG_DFL,目标环境开始默认处理(由实现定义)。
■如果func是SIG_IGN,目标环境将忽略该信号的后续报告。
否则,func必须是一个返回void的函数的地址,目标环境用一个int参数调用。目标环境在下次报告信号时调用这个函数来处理信号,并将信号的值作为其参数。
■当目标环境调用一个信号处理程序时。
■目标环境可以阻止相应信号的进一步发生,直到处理程序返回、调用longjmp或调用该信号的信号。
■目标环境可以对进一步出现的信号执行默认处理。
■目标环境可以对相应信号的进一步发生进行默认处理。
对于信号SIGILL,目标环境可以不改变对该信号的处理。

10.13.8 SIGSEGV

#define SIGSEGV <integer constant expression >= 0>

该宏产生无效存储访问信号的sig参数值,例如对
一个错误的lvalue表达式。

10.13.9 SIGTERM


#define SIGTERM <integer constant expression >= 0>

该宏产生的是异步终止请求信号的sig参数值。

10.13.10 SIG_DFL

#define SIG_DFL

.
该宏产生的func参数值为signal,以指定默认的信号处理。

10.13.11 SIG_ERR

#define SIG_ERR <address constant expression>

该宏产生的信号返回值指定一个错误的调用。

10.13.12 SIG_IGN

#define SIG_IGN <address constant expression>

该宏将func参数值转为signal,以指定目标环境从此忽略信号。
环境从今以后将忽略该信号。

10.14 stdarg.h

包括标准头文件<stdarg.h>来访问一个接受不同数量参数的函数中未命名的额外参数(没有相应参数声明的参数)。要访问附加参数。
■程序必须首先在函数的主体中执行宏va_start,以初始化一个带有上下文信息的对象。
■随后执行指定相同上下文信息的宏va_arg,可以按顺序得到附加参数的值,从第一个未命名的参数开始。你可以从任何可以访问由宏va_start保存的上下文信息的函数中执行宏va_arg。
■如果你在一个函数中执行了宏va_start,你必须在同一个函数中执行宏va_end,指定相同的上下文信息,然后函数返回。
你可以重复这个序列(根据需要)来访问参数,只要你想。
你声明一个类型为va_list的对象来存储上下文信息。va_list可以是一个数组类型,也可以是非数组类型。因此,你不能可靠地将一个这样的对象分配给另一个。va_list是否是一个数组类型会影响到程序如何与它所调用的函数共享上下文信息。一个数组的第一个元素的地址被传递,而不是对象本身。所以一个数组类型实际上是通过引用传递的,而一个非数组类型是通过值传递的。
比如说:

#include <stdarg.h>
             void va_cat(char *s, ...)
                 {
                 char *t;
                 va_list ap;
va_start(ap, s);
while (t = va_arg(ap, char *)) null pointer ends list
    {
    s += strlen(s);
    strcpy(s, t);
    }
va_end(ap);
}
skip to end
and copy a string

函数va_cat将任意数量的字符串连接到现有字符串的末尾(假设现有字符串被存储在一个足够大的对象中,以容纳所产生的字符串)。

#define va_arg(va_list ap, Ty) <rvalue of type Ty> #define va_end(va_list ap) <void expression>
#define va_start(va_list ap, last-par) <void expression> typedef do-type va_list;

10.14.1 va_arg

#define va_arg(va_list ap, Ty) <rvalue of type Ty>

该宏产生的是由ap指定的上下文信息所指定的下一个参数的值,按顺序排列。额外的参数必须是对象类型的Ty,这是在没有函数原型的情况下应用了促进参数的规则。

10.14.2 va_end

#define va_end(va_list ap) <void expression>

该宏在处理了ap指定的上下文信息后,执行了任何必要的清理工作,以便函数能够返回。
后,执行任何必要的清理工作,以便函数能够返回。

10.14.3 va_list

typedef do-type va_list;

该类型是你声明的对象类型do-type,用来保存上下文信息。
由va_start初始化,并由va_arg用来访问其他未命名的参数。

10.14.4 va_start

#define va_start(va_list ap, last-par) <void expression>

宏将初始上下文信息存储在由ap指定的对象中。 last-par是你声明的最后一个参数的名称。例如,对于声明为int f(int a, int b, …)的函数,last-par是b。最后一个参数不能有注册存储类,而且它必须有一个不被翻译器改变的类型。它不能有。
■一个数组类型
■一个函数类型
■Float类型
■任何在推广时改变的整数类型
■一个引用类型[仅限C++]

10.15 stddef.h

包括标准头文件<stddef.h>来定义几个在整个程序中普遍使用的类型和宏。标准头文件<stddef.h>甚至在独立的实现中也是可用的。

/* MACROS */
#define NULL <either 0, 0L, or (void *)0> [0 in C++] #define offsetof(s-type, mbr) <size_t constant expression>
/* TYPES */
typedef si-type ptrdiff_t;
typedef ui-type size_t;
typedef i-type wchar_t; [keyword in C++]

10.15.1 NULL

#define NULL <either 0, 0L, or (void *)0> [0 in C++]

该宏产生一个空指针常数,可作为地址常数表达式使用。

10.15.2 offsetof

#define offsetof(s-type, mbr) <size_t constant expression>

该宏产生成员mbr从结构类型s-type开始的偏移量(字节),类型为size_t,其中对于类型为s-type的X,&X.mbr是一个地址常量表达。

10.15.3 ptrdiff_t

typedef si-type ptrdiff_t;

该类型是一个对象的有符号整数类型si-type,你声明该对象用于存储
的对象,用于存储两个指针相减的结果。

10.15.4 size_t

typedef ui-type size_t;

类型是一个对象的无符号整数类型ui-type,你声明该对象用于存储
sizeof运算符的结果。

10.15.5 wchar_t

ypedef i-type wchar_t; [keyword in C++]

类型是一个宽字符常数的整数类型i-type,例如L’X’。你
声明一个wchar_t类型的对象来保存一个宽字符。

举报

相关推荐

0 条评论