异步信号
*信号与任何线程都是异步的.
*linux多线程扩展函数
int pthread_kill(pthread_t threadid, int signo);
int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask);
int sigwait(const sigset_t *set, int *sig);
*区别:
*函数pthread_kill用来向特定的线程发送信号signo,函数pthread_sigmask用来设置线程的信号屏蔽码,但对不允许屏蔽的Cancel信号和不允许响应的Restart信号进行了保护.函数sigwait用来阻塞线程,等待set中指定的信号之一到达,并将到达的信号存入*sig.
错误检查
*函数执行失败时,一般都会返回一个特定的值,比如:-l,空指针.
*头文件errno.h定义了变量errno(含义是error number),它存储了错误发生时的错误码,通过错误码可以得到错误的描述信息.
*程序开始执行时,变量errno被初始化为0.
错误码
*错误码是一些定义在errno.h中的宏.通常以字母E开头,后面由一串大写字母或数字组成.
*在定义自己的宏时,要避免与这些保留的宏名,除了EWOULDBLOCK和EAGAIN具有相同的值,其余所有的错误码的值都是非负且唯一的,因此在switch语句中可以使用它们.
*部分常见的错误码解释:
>ENOMEN:表示内存不足,系统不能再提供更多的虚拟内存
>EIO:输入输出错误,在读写磁盘时经常会遇到
>ENXIO:指定的设备或地址不存在
>EPERM:禁止操作,只有具备相应权限的进程才能执行该操作
>ESRCH:没有进程与给定的ID相匹配
>ENOENT:文件或目录不存在
>EINTR:函数调用被中断,如果发生这种错误,要重新调用函数
>E2BIG:参数过长
>ENOEXEC:可执行文件格式无效
>EBADF:文件描述符错误
>ECHILD:子进程不存在
>EBUSY:资源正在使用,不能共享
>EINVAL:无效的参数
>EMFILE:当前进程打开的文件已达上限,不能再打开其他文件
>ENFILE:系统打开的文件已达上限
>EFBIG:文件太大
>ENOTDIR:当需要目录的时候指定了一个非目录的文件
>EISDIR:文件是一个目录
>ENOTTY:不适当的I/O控制操作
>ETXTBSY:尝试执行一个正在进行写操作的文件或者尝试写一个正式执行的文件
>ENOSPC:设备上无剩余空间
错误提示信息
*函数strerror和perror可以通过错误码获取标准的错误提示信息.
*strerror函数在头文件string.h中声明
*strerror函数根据参数errnum提供的错误码获取一个描述错误信息的字符串,函数的返回值为指向该字符串的指针
*perror()函数声明在头文件stdio.h
*perror()打印错误信息到stderr,stderr在linux中通常就是指屏幕或命令行终端.调用perror()时,如果参数message是一个空指针,perror仅仅根据errno打印出对应的错误信息.如果提供一个非空的值,perror会把此message加在其输出信息的前面.
perror会添加一个冒号和空格将message和错误信息分开,以便区分.