亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? 16.htm

?? UNIX環(huán)境下C編程的詳細(xì)詳細(xì)介紹
?? HTM
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
<p>off_t offset, int whence, off_t ptrval) </p>

<p>{ </p>

<p>struct iovec iov[2]; </p>

<p>char asciiptrlen[PTR_SZ + IDXLEN_SZ +1]; </p>

<p>int len; </p>

<p>if ( (db-&gt;ptrval = ptrval) &lt; 0 || ptrval &gt; PTR_MAX) </p>

<p>err_quit(&quot;invalid ptr: %d&quot;, ptrval); </p>

<p>sprintf(db-&gt;idxbuf, &quot;%s%c%d%c%d\n&quot;, </p>

<p>key, SEP, db-&gt;datoff, SEP, db-&gt;datlen); </p>

<p>if ( (len = strlen(db-&gt;idxbuf)) &lt; IDXLEN_MIN || len &gt; IDXLEN_MAX) </p>

<p>err_dump(&quot;invalid length&quot;); </p>

<p>sprintf(asciiptrlen, &quot;%*d%*d&quot;, PTR_SZ, ptrval, IDXLEN_SZ, len); </p>

<p>/* If we're appending, we have to lock before doing the lseek() </p>

<p>and write() to make the two an atomic operation. If we're </p>

<p>overwriting an existing record, we don't have to lock. */ </p>

<p>if (whence == SEEK_END) /* we're appending */ </p>

<p>if (writew_lock(db-&gt;idxfd, ((db-&gt;nhash+1)*PTR_SZ)+1, </p>

<p>SEEK_SET, 0) &lt; 0) </p>

<p>err_dump(&quot;writew_lock error&quot;); </p>

<p>/* Position the index file and record the offset */ </p>

<p>if ( (db-&gt;idxoff = lseek(db-&gt;idxfd, offset, whence)) == -1) </p>

<p>err_dump(&quot;lseek error&quot;); </p>

<p>iov[0].iov_base = asciiptrlen; </p>

<p>iov[0].iov_len = PTR_SZ + IDXLEN_SZ; </p>

<p>iov[1].iov_base = db-&gt;idxbuf; </p>

<p>iov[1].iov_len = len; </p>

<p>if (writev(db-&gt;idxfd, &amp;iov[0], 2) != PTR_SZ + IDXLEN_SZ + len) </p>

<p>err_dump(&quot;writev error of index record&quot;); </p>

<p>if (whence == SEEK_END) </p>

<p>if (un_lock(db-&gt;idxfd, ((db-&gt;nhash+1)*PTR_SZ)+1, SEEK_SET, 0) &lt; 0) </p>

<p>err_dump(&quot;un_lock error&quot;); </p>

<p>} </p>

<p>程序16.16 _db_writeidx函數(shù) </p>

<p>_db_dodelete調(diào)用的最后一個(gè)函數(shù)是_db_writeptr(程序16.17)。它被調(diào)用 </p>

<p>兩次--一次用來(lái)寫空閑鏈表指針,一次用來(lái)寫Hash鏈表指針(指向被刪除索引記錄 
</p>

<p>的指針)。 </p>

<p>#include &quot;db.h&quot; </p>

<p>/* Write a chain ptr field somewhere in the index file: </p>

<p>* the free list, the hash table, or in an index record. */ </p>

<p>void </p>

<p>_db_writeptr(DB *db, off_t offset, off_t ptrval) </p>

<p>{ </p>

<p>char asciiptr[PTR_SZ + 1]; </p>

<p>if (ptrval &lt; 0 || ptrval &gt; PTR_MAX) </p>

<p>err_quit(&quot;invalid ptr: %d&quot;, ptrval); </p>

<p>sprintf(asciiptr, &quot;%*d&quot;, PTR_SZ, ptrval); </p>

<p>if (lseek(db-&gt;idxfd, offset, SEEK_SET) == -1) </p>

<p>err_dump(&quot;lseek error to ptr field&quot;); </p>

<p>if (write(db-&gt;idxfd, asciiptr, PTR_SZ) != PTR_SZ) </p>

<p>err_dump(&quot;write error of ptr field&quot;); </p>

<p>} </p>

<p>程序16.17 _db_writeptr函數(shù) </p>

<p>在程序16.18中列出了我們最長(zhǎng)的數(shù)據(jù)庫(kù)函數(shù)db_store。它從調(diào)用_db_find開(kāi) 
</p>

<p>始,以查看這個(gè)記錄是否存在。如果記錄存在且標(biāo)志為DB_REPLACE,或記錄不存在 
</p>

<p>且標(biāo)志為DB_INSERT,這些都是允許的。替換一條已存在的記錄,指的是該記錄的 
</p>

<p>主鍵一樣,而數(shù)據(jù)很可能不一樣。 </p>

<p>注意到因?yàn)閐b_store可能會(huì)改變Hash鏈,所以調(diào)用_db_find的最后一條參數(shù)說(shuō) 
</p>

<p>明要對(duì)Hash鏈加寫鎖。 </p>

<p>如果我們要加一條新記錄到數(shù)據(jù)庫(kù),我們調(diào)用函數(shù)_db_findfree(程序16.19 
</p>

<p>)在空閑鏈表中搜索一個(gè)有同樣主鍵大小和同樣數(shù)據(jù)大小的已刪除的記錄。 
</p>

<p>_db_findfree中的while循環(huán)遍歷空閑鏈表以搜尋一個(gè)有對(duì)應(yīng)主鍵大小和數(shù)據(jù) 
</p>

<p>大小的索引記錄項(xiàng)。在我們這個(gè)簡(jiǎn)單的實(shí)現(xiàn)中,只有當(dāng)一個(gè)已刪除記錄的的主鍵大 
</p>

<p>小及數(shù)據(jù)大小與新加入的記錄的主鍵大小及數(shù)據(jù)大小一樣時(shí)才重用已刪除的記錄的 
</p>

<p>空間。其它更好的算法一般更復(fù)雜。 </p>

<p>_db_findfree需要對(duì)空閑鏈表加寫鎖以避免與其它使用空閑鏈表的進(jìn)程互相影 
</p>

<p>響。當(dāng)一條記錄從空閑鏈表上取下來(lái)后,就可以打開(kāi)這個(gè)寫鎖。_db_dodelete也要 
</p>

<p>修改空閑鏈表。 </p>

<p>#include &quot;db.h&quot; </p>

<p>/* Store a record in the database. </p>

<p>* Return 0 if OK, 1 if record exists and DB_INSERT specified, </p>

<p>* -1 if record doesn't exist and DB_REPLACE specified. */ </p>

<p>int </p>

<p>db_store(DB *db, const char *key, const char *data, int flag) </p>

<p>{ </p>

<p>/* An empty record of the correct size was not found. </p>

<p>We have to append the new record to the ends of </p>

<p>the index and data files */ </p>

<p>_db_writedat(db, data, 0, SEEK_END); </p>

<p>_db_writeidx(db, key, 0, SEEK_END, ptrval); </p>

<p>/* db-&gt;idxoff was set by _db_writeidx(). The new </p>

<p>record goes to the front of the hash chain. */ </p>

<p>_db_writeptr(db, db-&gt;chainoff, db-&gt;idxoff); </p>

<p>db-&gt;cnt_stor1++; </p>

<p>} else { </p>

<p>/* We can reuse an empty record. </p>

<p>_db_findfree() removed the record from the free </p>

<p>list and set both db-&gt;datoff and db-&gt;idxoff. */ </p>

<p>_db_writedat(db, data, db-&gt;datoff, SEEK_SET); </p>

<p>_db_writeidx(db, key, db-&gt;idxoff, SEEK_SET, ptrval); </p>

<p>/* reused record goes to the front of the hash chain. */ </p>

<p>_db_writeptr(db, db-&gt;chainoff, db-&gt;idxoff); </p>

<p>db-&gt;cnt_stor2++; </p>

<p>} </p>

<p>} else { /* record found */ </p>

<p>if (flag &amp; DB_INSERT) { </p>

<p>rc = 1; </p>

<p>db-&gt;cnt_storerr++; </p>

<p>goto doreturn; /* error, record already in db */ </p>

<p>} </p>

<p>/* We are replacing an existing record. We know the new </p>

<p>key equals the existing key, but we need to check if </p>

<p>the data records are the same size. */ </p>

<p>if (datlen != db-&gt;datlen) { </p>

<p>_db_dodelete(db); /* delete the existing record */ </p>

<p>/* Reread the chain ptr in the hash table </p>

<p>(it may change with the deletion). */ </p>

<p>ptrval = _db_readptr(db, db-&gt;chainoff); </p>

<p>/* append new index and data records to end of files */ </p>

<p>_db_writedat(db, data, 0, SEEK_END); </p>

<p>_db_writeidx(db, key, 0, SEEK_END, ptrval); </p>

<p>/* new record goes to the front of the hash chain. */ </p>

<p>_db_writeptr(db, db-&gt;chainoff, db-&gt;idxoff); </p>

<p>db-&gt;cnt_stor3++; </p>

<p>} else { </p>

<p>/* same size data, just replace data record */ </p>

<p>_db_writedat(db, data, db-&gt;datoff, SEEK_SET); </p>

<p>db-&gt;cnt_stor4++; </p>

<p>} </p>

<p>} </p>

<p>rc = 0; /* OK */ </p>

<p>doreturn: /* unlock the hash chain that _db_find() locked */ </p>

<p>if (un_lock(db-&gt;idxfd, db-&gt;chainoff, SEEK_SET, 1) &lt; 0) </p>

<p>err_dump(&quot;un_lock error&quot;); </p>

<p>return(rc); </p>

<p>} </p>

<p>程序16.18 db_store函數(shù) </p>

<p>#include &quot;db.h&quot; </p>

<p>/* Try to find a free index record and accompanying data record </p>

<p>* of the correct sizes. We're only called by db_store(). */ </p>

<p>int </p>

<p>_db_findfree(DB *db, int keylen, int datlen) </p>

<p>{ </p>

<p>int rc; </p>

<p>off_t offset, nextoffset, saveoffset; </p>

<p>/* Lock the free list */ </p>

<p>if (writew_lock(db-&gt;idxfd, FREE_OFF, SEEK_SET, 1) &lt; 0) </p>

<p>err_dump(&quot;writew_lock error&quot;); </p>

<p>/* Read the free list pointer */ </p>

<p>saveoffset = FREE_OFF; </p>

<p>offset = _db_readptr(db, saveoffset); </p>

<p>while (offset != 0) { </p>

<p>nextoffset = _db_readidx(db, offset); </p>

<p>if (strlen(db-&gt;idxbuf) == keylen &amp;&amp; db-&gt;datlen == datlen) </p>

<p>break; /* found a match */ </p>

<p>saveoffset = offset; </p>

<p>offset = nextoffset; </p>

<p>} </p>

<p>if (offset == 0) </p>

<p>rc = -1; /* no match found */ </p>

<p>else { </p>

<p>/* Found a free record with matching sizes. </p>

<p>The index record was read in by _db_readidx() above, </p>

<p>which sets db-&gt;ptrval. Also, saveoffset points to </p>

<p>the chain ptr that pointed to this empty record on </p>

<p>the free list. We set this chain ptr to db-&gt;ptrval, </p>

<p>which removes the empty record from the free list. */ </p>

<p>_db_writeptr(db, saveoffset, db-&gt;ptrval); </p>

<p>rc = 0; </p>

<p>/* Notice also that _db_readidx() set both db-&gt;idxoff </p>

<p>and db-&gt;datoff. This is used by the caller, db_store(), </p>

<p>to write the new index record and data record. */ </p>

<p>} </p>

<p>/* Unlock the free list */ </p>

<p>if (un_lock(db-&gt;idxfd, FREE_OFF, SEEK_SET, 1) &lt; 0) </p>

<p>err_dump(&quot;un_lock error&quot;); </p>

<p>return(rc); </p>

<p>} </p>

<p>程序16.19 _db_findfree函數(shù) </p>

<p>回到函數(shù)db_store,在調(diào)用_db_find后,有四種可能: </p>

<p>1. 加入一條新的記錄,而_db_findfree沒(méi)有找到對(duì)應(yīng)大小的空閑記錄。這意味著 
</p>

<p>我們要將這條新記錄添加到索引文件和數(shù)據(jù)文件的末尾。通過(guò)調(diào)用_db_writeptr將 
</p>

<p>新記錄加到對(duì)應(yīng)的Hash鏈的鏈?zhǔn)住?</p>

<p>2. 加入一條新的記錄,且_db_findfree找到對(duì)應(yīng)大小的空閑記錄。這條空閑記錄 
</p>

<p>被_db_findfree從空閑鏈表上移下來(lái),新的索引記錄和數(shù)據(jù)記錄被寫入,然后通過(guò) 
</p>

<p>調(diào)用_db_writeptr將新記錄加到對(duì)應(yīng)的Hash鏈的鏈?zhǔn)住?</p>

<p>3. 
要替換一條記錄,而新數(shù)據(jù)記錄的長(zhǎng)度與已存在的記錄的長(zhǎng)度不一樣。我們調(diào) 
</p>

<p>用_db_dodelete將老記錄刪除,然后將新記錄添加到索引文件和數(shù)據(jù)文件的末尾( 
</p>

<p>也可以用其他方法,如我們可以再找一找是否有適當(dāng)大小的已刪除的記錄項(xiàng))。最 
</p>

<p>后調(diào)用_db_writeptr將新記錄加到對(duì)應(yīng)的Hash鏈的鏈?zhǔn)住?</p>

<p>4. 
要替換一條記錄,而新數(shù)據(jù)記錄的長(zhǎng)度與已存在的記錄的長(zhǎng)度恰好一樣。這是 
</p>

<p>最容易的情況,我們只需要重寫記錄即可。 </p>

<p>在向文件的末尾添加索引記錄或數(shù)據(jù)記錄時(shí),需要加鎖(回憶我們?cè)诔绦?2. 
</p>

<p>6中遇到的相對(duì)文件尾加鎖問(wèn)題)。在上面四種可能的第1和第3種情況,db_store 
</p>

<p>調(diào)用_db_writeidx和_db_writedat時(shí),第3個(gè)參數(shù)為0,第4個(gè)參數(shù)為SEEK_END。這 
</p>

<p>里,第4個(gè)參數(shù)作為一個(gè)標(biāo)志用來(lái)告訴這兩個(gè)函數(shù),新的記錄將被添加到文件的末 
</p>

<p>尾。_db_writeidx用到的技術(shù)是對(duì)索引文件加寫鎖,加鎖的范圍從Hash鏈的末尾到 
</p>

<p>文件的末尾。這不會(huì)影響其他數(shù)據(jù)庫(kù)的讀用戶和寫用戶(這些用戶將對(duì)Hash鏈加鎖 
</p>

<p>),但如果其他用戶此時(shí)調(diào)用db_store來(lái)添加數(shù)據(jù)則會(huì)被鎖住。_db_writedat使用 
</p>

<p>的方法是對(duì)整個(gè)數(shù)據(jù)文件加寫鎖。同樣這也不會(huì)影響其他數(shù)據(jù)庫(kù)的讀用戶和寫用戶 
</p>

<p>(它們甚至不對(duì)數(shù)據(jù)文件加鎖),但如果其他用戶此時(shí)調(diào)用db_store來(lái)向數(shù)據(jù)文件 
</p>

<p>添加數(shù)據(jù)則會(huì)被鎖住(見(jiàn)Exercise 16.3)。 </p>

<p>最后兩個(gè)函數(shù)是db_nextrec和db_rewind,這兩個(gè)函數(shù)用來(lái)讀取數(shù)據(jù)庫(kù)的所有 
</p>

<p>記錄。通常在下列形式的循環(huán)中的使用這兩個(gè)函數(shù): </p>

<p>db_rewind(db) ; </p>

<p>while( (ptr = db_nextrec(db, key)) != NULL) { </p>

<p>/* process record */ </p>

<p>} </p>

<p>我們前面警告過(guò),這里記錄的返回沒(méi)有一定的次序--它們并不按主鍵的順序。 
</p>

<p>函數(shù)db_rewind(程序16.20)將索引文件定位在第一條索引記錄(緊跟在Has 
</p>

<p>h表后面)。 </p>

<p>#include &quot;db.h&quot; </p>

<p>/* Rewind the index file for db_nextrec(). </p>

<p>* Automatically called by db_open(). </p>

<p>* Must be called before first db_nextrec(). </p>

<p>*/ </p>

<p>void </p>

<p>db_rewind(DB *db) </p>

<p>{ </p>

<p>off_t offset; </p>

<p>offset = (db-&gt;nhash + 1) * PTR_SZ; /* +1 for free list ptr */ </p>

<p>/* We're just setting the file offset for this process </p>

<p>to the start of the index records; no need to lock. </p>

<p>+1 below for

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品成人一区二区三区 | 一区二区在线观看不卡| 欧美日韩一区二区三区高清| 国产一区二区三区免费| 亚洲午夜av在线| 日本一区二区电影| 日韩一区二区三区在线| 色婷婷精品久久二区二区蜜臀av| 韩国女主播成人在线观看| 亚洲第一在线综合网站| 国产欧美日韩不卡| 日韩三级精品电影久久久 | 黄色日韩三级电影| 亚洲国产裸拍裸体视频在线观看乱了| 国产日韩三级在线| 欧美成人一区二区| 欧美人妇做爰xxxⅹ性高电影| av不卡在线观看| 国产精品亚洲一区二区三区在线| 午夜精品福利在线| 一区二区三区四区在线免费观看 | 国产真实精品久久二三区| 亚洲高清在线精品| 一区二区三区四区中文字幕| 中文字幕日本不卡| 欧美激情在线免费观看| 精品少妇一区二区| 日韩一级成人av| 91精品国产麻豆| 欧美日韩日日夜夜| 欧美色电影在线| 在线观看免费亚洲| 欧美性猛交xxxx乱大交退制版| 国产999精品久久| 91超碰这里只有精品国产| 色综合欧美在线| 97se狠狠狠综合亚洲狠狠| 成人免费电影视频| 风间由美中文字幕在线看视频国产欧美| 韩国女主播一区| 国产乱一区二区| 国产乱子轮精品视频| 国产精品亚洲一区二区三区妖精| 国内一区二区在线| 国产老肥熟一区二区三区| 麻豆国产精品视频| 国内精品嫩模私拍在线| 九色综合狠狠综合久久| 国产一区二区视频在线播放| 国产九色sp调教91| 99久久国产综合精品女不卡| 99在线精品视频| 色综合久久天天| 欧美色中文字幕| 69堂国产成人免费视频| 精品国产麻豆免费人成网站| 26uuu亚洲综合色| 中文字幕的久久| 亚洲精品国产一区二区三区四区在线| 亚洲欧美另类小说| 日韩电影在线看| 国产剧情一区二区三区| av电影在线观看完整版一区二区| 色激情天天射综合网| 欧美日韩国产小视频| 欧美大片拔萝卜| 国产精品免费丝袜| 亚洲国产一区二区视频| 麻豆精品久久久| 丰满白嫩尤物一区二区| 欧美午夜精品电影| 日韩免费观看2025年上映的电影| 中文字幕第一区二区| 亚洲永久精品国产| 国内欧美视频一区二区| 一本大道久久a久久综合婷婷| 欧美性生活久久| 久久伊99综合婷婷久久伊| 国产精品久久久久久久蜜臀| 香蕉加勒比综合久久| 狠狠色丁香久久婷婷综合_中| 99久久免费精品高清特色大片| 欧美唯美清纯偷拍| 久久亚洲综合色一区二区三区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 制服丝袜成人动漫| 国产欧美日韩另类一区| 天天综合网 天天综合色| 北条麻妃国产九九精品视频| 777xxx欧美| 亚洲免费观看在线观看| 久久69国产一区二区蜜臀| 91免费小视频| 久久美女高清视频| 日韩精品免费专区| av在线不卡观看免费观看| 欧美电影免费观看高清完整版在线观看 | 日本高清不卡aⅴ免费网站| 日韩欧美中文字幕制服| 夜夜夜精品看看| 欧美成人女星排行榜| 亚洲一区二区三区四区五区黄| 国产毛片精品国产一区二区三区| 欧美日韩精品欧美日韩精品 | 日韩一区和二区| 一区二区三区精品在线| 成人免费观看视频| 精品久久五月天| 日韩成人免费电影| 91黄色小视频| 国产精品久久午夜夜伦鲁鲁| 狠狠久久亚洲欧美| 91精品国产综合久久蜜臀| 亚洲人妖av一区二区| 国产99久久久精品| 精品国产91亚洲一区二区三区婷婷| 亚洲国产精品一区二区久久 | 亚洲视频一区二区免费在线观看| 国产一区二区精品久久91| 欧美一区二区三区免费观看视频| 一区二区三区四区亚洲| 91在线云播放| 国产精品久久99| 国产91露脸合集magnet| 久久久噜噜噜久噜久久综合| 精品一区二区三区日韩| 欧美成va人片在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美日韩二区三区| 亚洲国产成人精品视频| 欧美伊人久久久久久午夜久久久久| 亚洲欧美日韩电影| av成人免费在线观看| 自拍偷拍亚洲欧美日韩| av一区二区三区| 亚洲人成人一区二区在线观看| 菠萝蜜视频在线观看一区| 欧美激情一区二区三区在线| 国产精品一区二区久久精品爱涩 | 亚洲成精国产精品女| 欧美撒尿777hd撒尿| 亚洲第一在线综合网站| 精品视频一区三区九区| 天天操天天干天天综合网| 欧美精品tushy高清| 日本不卡视频在线| 日韩美女主播在线视频一区二区三区| 蜜桃av噜噜一区| 欧美一级黄色录像| 久99久精品视频免费观看| 久久久www免费人成精品| 成人午夜精品在线| 亚洲品质自拍视频| 9191精品国产综合久久久久久| 美女在线观看视频一区二区| 精品福利一二区| 成年人网站91| 香蕉成人啪国产精品视频综合网| 3d成人h动漫网站入口| 激情图片小说一区| 国产精品久久久久三级| 91久久精品国产91性色tv| 日韩中文字幕一区二区三区| 精品少妇一区二区三区日产乱码 | 欧美一个色资源| 国产老肥熟一区二区三区| 亚洲欧洲日产国码二区| 欧美写真视频网站| 久热成人在线视频| 欧美激情一区二区| 欧美中文字幕一二三区视频| 久久av资源网| 日韩一区欧美小说| 欧美一级二级在线观看| 欧美精品一区二区蜜臀亚洲| 成人黄色软件下载| 偷窥少妇高潮呻吟av久久免费| 久久一夜天堂av一区二区三区| 91丨九色丨黑人外教| 青青草精品视频| 18成人在线观看| 欧美不卡一二三| 色94色欧美sute亚洲线路二 | 老鸭窝一区二区久久精品| 国产精品视频一二三区| 制服视频三区第一页精品| 成人h精品动漫一区二区三区| 天天操天天色综合| 亚洲欧洲精品成人久久奇米网| 在线电影一区二区三区| 9久草视频在线视频精品| 奇米影视一区二区三区| 亚洲欧美色图小说| 精品福利二区三区| 欧美日韩国产不卡| 91视频xxxx| 国产福利91精品一区| 奇米色一区二区| 亚洲精品大片www| 亚洲国产成人一区二区三区|