系统调用-open函数的oflags参数引起的调试经历
来源:互联网 发布:网络吞吐率 编辑:程序博客网 时间:2024/05/16 13:54
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://blog.csdn.net/tobyaries/article/details/8280088
这篇博文可能放在这个类别也许并不合适,放在这里完全是因为是我在实验《Beginning Linux Programming》(Linux程序设计)一书中的一个进程通信例子的调试经历。这个例子是Page.449 (陈建 宋健建 译本)的实验:"打开FIFO文件"。
完成输入、编译、运行 ./fifo2 O_RDONLY 得到的是 process XXX result -1。根据代码可以判断,显然这句出错时因为代码
res = open(FIFO_NAME, open_mode);
为什么返回值是-1呢?在书中Page.83 中给了些线索: “open调用在成功时返回一个新的文件描述符(他总是一个非负整数),失败时返回-1,并设置全局变量errno以指明失败的原因。”
也就是说我需要打印errno来看是什么问题导致返回-1。在平时调试工作中,这种加打印的办法很常见。说点题外话,上次电面一家知名的外企通信公司,有个问题就是平时工作中的调试手段,比如如何判断出系统发生了死锁。常见的调试法就是:1)通过调试工具,如gdb看函数调用栈;2)加打印;3)看门狗,一旦失活就说明有问题、
在fifo2.c中,我打印了errno的值,为17 。接下来就需要找到系统中的errno了。那么如何找到自己系统中的errno呢?我用的方法是直接find / -name errno.h 而且一般都会放在标准路径下,如 /usr/include/.. 我的是在 /usr/inlude/asm-generic 下面。可以找到17对应的异常为EEXITS。
我很纳闷为什么会返回文件存在的出错?fifo_name虽然有了,打开不就行了没,也没必要返回出错吧。。。后来突然想到 open_mode这个标志位。如果open_mode是O_CRATE,是不是新创建文件就无所谓,而如果是同时包含了O_EXCL标志位,就必须是新创建的文件。O_EXCL就是为了检测文件是否是新建的。因此肯定是open_mode出错了,顺藤摸瓜,发现open_mode没有初始化。。。原书无误,是我敲代码时候忘记了。open_mode初始化为0后就ok了。
我认为如果没有初始化,open_mode会被随机赋值,最有可能赋值的就是 O_CRATE | O_EXCL
本文出自 “i小跟班” 博客,请务必保留此出处http://blog.csdn.net/tobyaries/article/details/8280088
- 系统调用-open函数的oflags参数引起的调试经历
- 彻底的系统调用---open函数
- 彻底的系统调用---open函数
- 系统调用1--open函数的使用
- 调用系统函数引起的core dump问题------错误地调用了正确的系统函数
- 一次LoadLibrary调用失败的调试经历
- 系统调用Open()函数的内核追踪(上篇)
- 系统调用Open()函数的内核追踪(下篇)
- 系统调用open函数
- Linux系统函数open和close(03)---open函数的参数
- open系统调用的源码
- open函数的参数问题
- 函数调用方式引起的编译错误
- Recordset的Open函数的参数LockType
- unix系统调用 open 函数
- 系统调用open的大概执行路径
- open系统调用的O_CREAT和O_EXCL
- Recordset对象的Open函数参数
- 理解signal()
- U-boot分析(1)
- Ubuntu11.10 更新软件源source.list
- 通知,about“一起学python”
- [Win32]一个调试器的实现(三)异常
- 系统调用-open函数的oflags参数引起的调试经历
- hdu 4020 hash的精妙运用
- tic-tac-toe Minimax(极小化极大算法)
- android写文件到sd卡要有权限声明
- u-boot分析(2)
- Archlinux使用最新版goagent的几点注意(无法上传问题)
- js正则表达式初学
- 条件随机场(之计算联合概率分布的有效模型)
- Spring in Action 3 - pointcut