﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-srjklssj</title><link>http://www.cppblog.com/srjklssj/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2026 17:48:54 GMT</lastBuildDate><pubDate>Tue, 09 Jun 2026 17:48:54 GMT</pubDate><ttl>60</ttl><item><title>lseek 偏移量大于31位地址长度时出现Invalid argument的解决方案</title><link>http://www.cppblog.com/srjklssj/archive/2012/02/15/165688.html</link><dc:creator>Kauffman</dc:creator><author>Kauffman</author><pubDate>Wed, 15 Feb 2012 10:50:00 GMT</pubDate><guid>http://www.cppblog.com/srjklssj/archive/2012/02/15/165688.html</guid><wfw:comment>http://www.cppblog.com/srjklssj/comments/165688.html</wfw:comment><comments>http://www.cppblog.com/srjklssj/archive/2012/02/15/165688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/srjklssj/comments/commentRss/165688.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/srjklssj/services/trackbacks/165688.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;最近在研究关于ext2 文件系统相关的内容，拿一张4G的SD卡做实验。过程曲折离奇，问题不断，但最让我痛疼就是调用pread 或者lseek 时，当偏移量过大就会出现Invalid argument 的错误。断断续续这个问题折磨了我两天，今天终于搞定，心情舒畅&#8230;&#8230;好了，闲话少扯，回归正题。&nbsp;<br />&nbsp; &nbsp; &nbsp; 当首次遇到这个问题时我首先man 了一下pread 和lseek 发现其中的offset 参数定义为<span style="color: #0000ff; ">off_t</span>, 不清楚<span style="color: #0000ff; ">off_t&nbsp;</span>到底是有符号还是无符号，上网google 了一下，很不幸被我看到的第一个答案是错误的，他说<span style="color: #0000ff; ">off_t</span> 定义为<span style="color: #0000ff; ">unsigned long</span>。&#9582;(&#9583;&#9661;&#9584;)&#9581; 就这样我误认为，<span style="color: #0000ff; ">offset </span>的上限应该是32位无符号整数，当做4G SD卡的地址正好。可惜事实是<span style="color: #0000ff; ">off_t </span>在&lt;sys/type.h&gt;中被定义为<span style="color: #0000ff; ">long</span>&#8230;&#8230;我勒个去，头发掉了一把的教训，以后直接看源码算了&#8230;&#8230;<br />&nbsp; &nbsp; &nbsp; 问题是发现了，但怎么解决呢？很简单，使用pread64 或是lseek64 将地址范围扩大成64位。在使用lseek64时别忘了在包含头文件前加上宏定义，宏定义加在包含的头文件之后没有意义。eg:<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">#define</span>&nbsp;_LARGEFILE64_SOURCE<br />#include&nbsp;&lt;stdlib.h&gt;<br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;unistd.h&gt;<br />#include&nbsp;&lt;sys/types.h&gt;<br />#include&nbsp;&lt;sys/stat.h&gt;<br />#include&nbsp;&lt;fcntl.h&gt;<br />#include&nbsp;&lt;errno.h&gt;</div><br />OK, 搞定ext2文件系统分析，找时间写个总结。下一步：usb驱动 + LCD驱动<img src ="http://www.cppblog.com/srjklssj/aggbug/165688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/srjklssj/" target="_blank">Kauffman</a> 2012-02-15 18:50 <a href="http://www.cppblog.com/srjklssj/archive/2012/02/15/165688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>