第1章 UNIX基础知识

1.操作系统的定义

① 操作系统严格意义将指的是内核部分,内核指的是一种控制硬件的软件,为其他应用软件提供运行环境
② 宽泛来说,是指内核和一些软件应用等

2.出错处理相关 errno 变量及:strerror和perror

    在文件<errno.h>文件中定义了errno 以及可以赋予它的各个常量。这些常量都以E开头。该变量在头文件中的定义

#ifndef errno
    extern int errno;
#endif

    因为,errno可以把最后一次调用C的错误代码保留,如果最后一次调用C函数成功,则不会更改errno,所以如果你要使用之前,可以先清空errno,然后通过errno判断下面要执行的函数是否成功。另外,任何函数都不会将errno的值设置为0,而且<errno.h>中的所有常量都不为0.

       把errno转换为相应文字:

            1>  使用strerror函数

                   函数原型:char * strerror(int errno)

                   使用方法:fprintf(stderr, "%s", strerror(errno));

            2>  使用perror函数

                   函数原型:void perror(const char *s)

                   使用说明:参数s指定的字符串是要先打印出来的信息,可以由我们自己定义,然后系统会在s字符串后加上错误原因的字符串。

    下面是一个例程:

#include "apue.h"
#include <errno.h>
int
main(int argc, char *argv[])
{
    fprintf(stderr, "EACCES: %s\n", strerror(EACCES));
    errno = ENOENT;
    perror(argv[0]);
    exit(0);
}	//编译成 a.out 文件,运行方式:./a.out

输出:
EACCES: Permission denied
./a.out: No such file or directory

    注:errno是全局变量,如果在多线程或者进程编程中,子线程想要查看errno确定自己的错误类型,可惜该errno被另一个线程更改了,这就出问题了。errno的线程/进程安全性指的就是这点,在多线程和多进程编程中,errno会变为线程或进程的私有变量。

       POSIX和ISO C将errno定义为一个符号,它可以是一个包含出错编号的整数,也可以是一个返回出错编号指针的函数。

extern int *__errno_location(void);
#if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value.  */
    #define errno (*__errno_location ())
#endif



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值