第1章 UNIX基础知识

来源:互联网 发布:手机短信群发软件免费 编辑:程序博客网 时间:2024/05/28 15:29

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>intmain(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



原创粉丝点击