C标准库函数-4 setjmp.h signal.h time.h

setjmp.h

头文件<setjmp.h>中的说明提供了一种避免通常的函数调用和返回顺序的途径,特别的,它允许立即从一个多层嵌套的函数调用中返回。

setjmp

int setjmp(jmp_buf env);
setjmp()宏把当前状态信息保存到env中,供以后longjmp()恢复状态信息时使用。如果是直接调用setjmp(),那么返回值为0;如果是由于调用longjmp()而调用setjmp(),那么返回值非0。setjmp()只能在某些特定情况下调用,如在if语句、switch语句及循环语句的条件测试部分以及一些简单的关系表达式中。

longjmp

void longjmp(jmp_buf env, int val);
longjmp()用于恢复由最近一次调用setjmp()时保存到env的状态信息。当它执行完时,程序就象setjmp()刚刚执行完并返回非0值val那样继续执行。包含setjmp()宏调用的函数一定不能已经终止。所有可访问的对象的值都与调用longjmp()时相同,唯一的例外是,那些调用setjmp()宏的函数中的非volatile自动变量如果在调用setjmp()后有了改变,那么就变成未定义的。

signal.h

头文件<signal.h>中提供了一些用于处理程序运行期间所引发的异常条件的功能,如处理来源于外部的中断信号或程序执行期间出现的错误等事件。

signal

void (*signal(int sig, void (*handler)(int)))(int);
signal()用于确定以后当信号sig出现时的处理方法。如果handler的值是SIG_DFL,那么就采用实现定义的缺省行为;如果handler的值是SIG_IGN,那么就忽略该信号;否则,调用handler所指向的函数(参数为信号类型)。有效的信号包括:
信号含义
SIGABRT异常终止,如调用abort()。
SIGFPE算术运算出错,如除数为0或溢出。
SIGILL非法函数映象,如非法指令。
SIGINT交互式信号,如中断。
SIGSEGV非法访问存储器,如访问不存在的内存单元
SIGTERM发送给本程序的终止请求信号。
signal()返回信号sig原来的的handler;如果出错,则返回SIG_ERR。
当随后出现信号sig时,就中断正在执行的操作,转而执行信号处理函数(*handler)(sig)。如果从信号处理程序中返回,则从中断的位置继续执行。
信号的初始状态由实现定义。

raise

int raise(int sig);
向程序发送信号sig。如果发送不成功,就返回一个非0值。

time.h (有些函数要注意:结果存储在静态对象中)

头文件<time.h>中说明了一些用于处理日期和时间的类型和函数。其中的一部分函数用于处理当地时间,因为时区等原因,当地时间与日历时间可能不相同。clock_t和time_t是两个用于表示时间的算术类型,而struct tm则用于存放日历时间的各个成分。tm的各个成员的用途及取值范围如下:
    int tm_sec; /* 秒,0~61 */
    int tm_min; /* 分,0~59 */
    int tm_hour; /* 时,0~23 */
    int tm_mday; /* 日,1~31 */
    int tm_mon; /* 月(从1月开始),0~11 */
    int tm_year; /* 年(从1900年开始) */
    int tm_wday; /* 星期(从周日开始),0~6 */
    int tm_yday; /* 天数(从1月1日开始),0~365 */
    int tm_isdst; /* 夏令时标记 */
其中,tm_isdst在使用夏令时时其值为正,在不使用夏令时时其值为0,如果该信息不能使用,其值为负。

clock

clock_t clock(void);
返回程序自开始执行到目前为止所占用的处理机时间。如果处理机时间不可使用,那么返回-1。clock()/CLOCKS_PER_SEC是以秒为单位表示的时间。

time

time_t time(time_t *tp);
返回当前日历时间。如果日历时间不能使用,则返回-1。如果tp不为NULL,那么同时把返回值赋给*tp。

difftime

double difftime(time_t time2, time_t time1);
返回time2-time1的值(以秒为单位)。

mktime

time_t mktime(struct tm *tp);
将结构*tp中的当地时间转换为time_t类型的日历时间,并返回该时间。如果不能转换,则返回-1。

asctime

char *asctime(const struct tm *tp);
将结构*tp中的时间转换成如下所示的字符串形式:
    day month date hours:minutes:seconds year\n\0
如:
    Fri Apr 15 15:14:13 2005\n\0
返回指向该字符串的指针。字符串存储在可被其他调用重写的静态对象中。

ctime

char *ctime(const time_t *tp);
将*tp中的日历时间转换为当地时间的字符串,并返回指向该字符串指针。字符串存储在可被其他调用重写的静态对象中。等价于如下调用:
asctime(localtime(tp))

gmtime

struct tm *gmtime(const time_t *tp);
将*tp中的日历时间转换成struct tm结构形式的国际标准时间(UTC),并返回指向该结构的指针。如果转换失败,返回NULL。结构内容存储在可被其他调用重写的静态对象中。

localtime

struct tm *localtime(const time_t *tp);
将*tp中的日历时间转换成struct tm结构形式的本地时间,并返回指向该结构的指针。结构内容存储在可被其他调用重写的静态对象中。多线程的时候最好用localtime_r

localtime_r

struct tm *localtime_r(const time_t *timep, struct tm *result);
和localtime一样,只是这个函数将结果放在了形参中,所以是线程安全的。windows下是localtime_s

strftime

size_t strftime(char *s, size_t smax, const char *fmt, \
const struct tm *tp);
根据fmt的格式说明把结构*tp中的日期与时间信息转换成指定的格式,并存储到s所指向的数组中,写到s中的字符数不能多于smax。函数返回实际写到s中的字符数(不包括'\0');如果产生的字符数多于smax,则返回0。
fmt类似于printf()中的格式说明,它由0个或多个转换规格说明与普通字符组成。普通字符原封不动的拷贝到s中,每个%c按照下面所描述的格式用与当地环境相适应的值来替换。

转换规格列表如下:

格式说明
%a一星期中各天的缩写名
%A一星期中各天的全名
%b缩写月份名
%B月份全名
%c当地时间和日期表示
%d用整数表示的一个月中的第几天(01~31)
%H用整数表示的时(24小时制,00~23)
%I用整数表示的时(12小时制,01~12)
%j用整数表示的一年中各天(001~366)
%m用整数表示的月份(01~12)
%M用整数表示的分(00~59)
%p与AM/PM对应的当地表示方法
%S用整数表示的秒(00~61)
%U用整数表示一年中的星期数(00~53,将星期日看作为每周的第一天)
%w用整数表示一周中的各天(0~6,星期日为0)
%W用整数表示一年中的星期数(00~53,将星期一看作为每周的第一天)
%x当地日期表示
%X当地时间表示
%y不带公元的年(00~99)
%Y完整年份表示
%Z时区名字(可获得时)
%%%本身

内容并非完全原创,是老师给的资料。再结合网上其他资料对函数的说明进行了补充和完善。后续若编者在使用函数过程中有另外体会,会持续更新。小伙伴们觉得有不妥或有补充,欢迎留言。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值