·ChinaUnix首页 ·论坛 ·博客 
Linux首页 | Linux新闻 | Linux文档 | Linux论坛 | Linux下载 | Linux博客 | Linux搜索
新手入门 | 安装启动 | 管理员指南 | 开发手册 | 桌面应用 | 程序开发 | 数据库 | 网络技术| CentOS | Fedora | MySQL | Apache | Ubuntu | Gentoo| OSCON08
  Linux时代 >> 技术文档 >> 程序开发
 
pthread函数的错误检查机制
来源: ChinaUnix博客  日期: 2008.04.10 11:18 (共有条评论) 我要评论
 

               
               
                #include stdio.h>
#include pthread.h>
#include errno.h>
#include string.h>
//extern int      errno;
int main(int argc, char **argv)
{
        pthread_t               thread;
        int                     status;
        
        status = pthread_join(pthread_self(), NULL);
        if(status != 0){
                fprintf(stderr, "error %d: %s\n", status, strerror(status));
        }
        if(status == EDEADLK){
                printf("error is EDEADLK\n");
        }
        printf("errno = %d\n", errno);
        return status;
}
执行结果:
error 35: Resource deadlock avoided
error is EDEADLK
errno = 0
1.传统上的函数在成功返回时,返回一个0指示调用成功或者返回一个有效值,当有错误发生时候,返回-1,并对全局变量errno赋值以指示错误类型;传统的报错机制很难创建在报错的同时返回一个有用的-1值的函数。
2.pthread函数在出错时不会设置errno变量(如上面程序,pthread_join出错,errno仍为0),而大多数其它posix函数会设置。
3.pthread函数用返回值表示错误状态,而不是errno,(比如上面程序,用返回值status表示错误状态EDEADLK), 当成功时返回0,并包含一个额外的输出参数来指向存有“有用结果”的地址;当有错误发生时,返回一个包含在里的错误代码。
4.pthread同样提供了线程内的errno变量以支持其它使用errno的代码,意味着当线程调用使用errno报错的函数时,errno不会被其它线程重写或者读取;设置和读取线程内的errno变量要比读取内存地址或者返回值带来更多的开销。而传统的UNIX系统和POSIX.1-1990标准中, errno是一个外部整形变量, 由于一次只能有一个值,所以只能支持进程中的单一执行流程(所以,上面例子中, extern int errno 可以去掉)。
5.pthread_join遇到无效的线程id的时候会返回错误代码ESRCH,显示信息:error 3: no such process,如果遇到初始线程(上面例子中,进程没有其它线程),此时,如果Pthread函数实现自死锁检测功能,pthread_join会返回错误代码EDEADLK, 否则线程将挂起等待自己退出(即自死锁)。
6.pthread中没有像perror那样按照指定格式打印错误信息的等价函数,相反使用strerror获得多错误代码的描述,然后打印到strerr文件流中(如上面例子)。
4.


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/41113/showart_525030.html
  发表评论 查看评论(共有条评论) 我要提问
 
 


最新资讯更多>> 
· 开发者发行版:Debian Live 5...
· 再谈 Ubuntu 8.04 Hardy LTS 软..
· 加拿大魁北克省政府被控无视自..
· Mozilla 85%资金来自谷歌 将再..
· 保障Linux系统桌面安全的九个小..
· 开源编译器GCC 4.3.2发布
· Ubuntu发布最新版安全更新 以修..
· 比苹果的操作系统更加的豪华Ub..
· 坏运连连 红帽RHEL自带Perl再爆..
· 点评番茄花园事件
论坛热点更多>> 
· 突然发现了初恋女友的下落。..
· ubuntu 上网设置问题 郑州广..
· 『有奖征集』ChinaUnix论坛L..
· 团长老婆多大?
· 一直打喷嚏
· 看看你是不是带错了!!!!!!!!!!zt
· 这有大学肄业的没?说说原因吧。
· sudo的问题。棘手
· 看到一个大二的孩子说把GCC和..
· MIPS资料合集
文档更新更多>> 
· traceroute命令和tcpdump命令
· Linux磁盘管理指令集(二)
· Linux磁盘管理指令集(一)
· 给笔记本电脑装Linux系统
· set uid ,set gid,sticky bit的三..
· 文件结构体struct file(Linux 2...
· rpm包的安装、删除、效验、查询
· git-svn 简介
· 基础_tar.gz,tar.bz2
· 使用yum 代替up2date 自动更新升..
 
关于我们 | 联系方式 | 广告合作 | 诚聘英才 | 网站地图 | 友情链接 | 免费注册

Copyright © 2001-2008 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们