亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
樓主: duanjigang
打印 上一主題 下一主題

Linux平臺(tái)軟件管理系統(tǒng)設(shè)計(jì)與規(guī)劃-基礎(chǔ)篇(1)-RPM文件認(rèn)識(shí)與格式剖析 [復(fù)制鏈接]

論壇徽章:
0
11 [報(bào)告]
發(fā)表于 2012-11-15 13:48 |只看該作者

多謝茂哥,歇歇繼續(xù)。。

論壇徽章:
154
2022北京冬奧會(huì)紀(jì)念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16賽季CBA聯(lián)賽之深圳
日期:2022-11-02 14:02:4515-16賽季CBA聯(lián)賽之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16賽季CBA聯(lián)賽之八一
日期:2023-11-04 19:23:5115-16賽季CBA聯(lián)賽之廣夏
日期:2023-12-13 18:09:34
12 [報(bào)告]
發(fā)表于 2012-11-15 13:51 |只看該作者
9月的那個(gè)大會(huì)參加過(guò),感覺(jué)蘭蘭在臺(tái)上氣場(chǎng)不足,

如果練習(xí)不起來(lái),就學(xué)習(xí)網(wǎng)易的哪位先暴數(shù)據(jù),在公司多少年,因?yàn)樽隽藗(gè)什么系統(tǒng),從此不用加班
會(huì)場(chǎng)反映,很管用lol

論壇徽章:
0
13 [報(bào)告]
發(fā)表于 2012-11-15 13:53 |只看該作者
本帖最后由 duanjigang 于 2012-11-16 10:43 編輯

回復(fù) 12# shang2010


頭結(jié)構(gòu)體 header structure

接著說(shuō) RPM 文件格式的其它部分,這部分文字大多是根據(jù)官方的說(shuō)法翻譯而來(lái),加些自己的理解。

從 上面 講到的 lead 結(jié)構(gòu)體可以看到,lead 這個(gè)結(jié)構(gòu)體從編程角度來(lái)來(lái)講,很好用,要讀取成員,你只需要用

  1. xx->name
復(fù)制代碼
即可獲取到 rpm 的名字,但是,很容易發(fā)現(xiàn),name 這個(gè)數(shù)組的長(zhǎng)度只能容納 66 個(gè)字符,如果包的名字長(zhǎng)度超過(guò)66個(gè)字符,怎么辦呢?
有的開(kāi)發(fā)人員可能會(huì)想到,說(shuō)我把 name 長(zhǎng)度改成 100,256,    這樣是能處理大多數(shù)包,但是會(huì)帶來(lái)兩個(gè)問(wèn)題:

(1): name 長(zhǎng)度修改了,重新生成的 rpm 命令,會(huì)去按照新的格式讀取rpm文件,這樣,新版的rpm命令就不能讀取老的格式的 rpm 文件。
(2): 老版本的rpm 命令,不能正確讀取新版本的rpm文件。

因此,要解決此類(lèi)問(wèn)題,就需要講數(shù)據(jù)的存儲(chǔ)和讀取規(guī)范化,或者說(shuō),需要把跟業(yè)務(wù)相關(guān)的數(shù)據(jù)在協(xié)議中弱化,在協(xié)議中只見(jiàn)協(xié)議,不見(jiàn)跟業(yè)務(wù)相關(guān)的數(shù)據(jù)。
我想,這是好多軟件設(shè)計(jì)的原則吧,工具和業(yè)務(wù)分開(kāi),才能靈活擴(kuò)展,特別是通訊程序之類(lèi)的應(yīng)用。

RPM 文件中為了解決數(shù)據(jù)統(tǒng)一讀取和存儲(chǔ)的需求,引入了 頭結(jié)構(gòu)體 (header structure),在一個(gè)文件中,可以有一個(gè)或者多個(gè) header structure, 當(dāng)然,在RPM文件中
只有兩個(gè)header structure,一個(gè)是 signature 數(shù)據(jù)塊,一個(gè)是header 數(shù)據(jù)塊。

  每一個(gè) header structure 有 三部分:
    第一部分叫做:header structure header, 用來(lái)標(biāo)識(shí)一個(gè)header structrure 的起始位置,header structure 的大小,以及它包含的數(shù)據(jù)條目數(shù)。
    第二部分緊跟 header structure header,叫索引 index ,index 包含了多個(gè)index條目,其中每個(gè) index 條目都是對(duì)一塊數(shù)據(jù)的描述,每個(gè)index告訴你它指向的數(shù)據(jù)是什么樣子的,在哪存著。;旧礁鶕(jù)index你就能獲取到這個(gè)index對(duì)應(yīng)的數(shù)據(jù)。
  第三部分是存儲(chǔ)字段,叫 store, 存儲(chǔ)了 index 描述的數(shù)據(jù)。

好了,之所以引入這個(gè)header structure, 是因?yàn)樵谛掳姹局,為了補(bǔ)充lead的不足,header structure 已經(jīng)在新版rpm中使用了,但是能將這個(gè)歷史講下最好,方便我們學(xué)習(xí)。
下面繼續(xù)回到 RPM 文件后面的部分,signature 和 header 部分,看看這兩個(gè) header structure.





論壇徽章:
0
14 [報(bào)告]
發(fā)表于 2012-11-16 10:46 |只看該作者
本帖最后由 duanjigang 于 2012-11-16 14:06 編輯

接著看 RPM 的兩個(gè) header structure.:wink:

在 RPM 文件中,每個(gè) header structure 開(kāi)始都是用三個(gè)字節(jié)的神秘?cái)?shù)字開(kāi)始 "8E AD E8",

而且前文,我已經(jīng)得瑟了
,每個(gè)RPM有兩個(gè) header structure-- signature 和 header,我們不妨打開(kāi)一個(gè)rpm文件看看,我手頭的這個(gè)為例,如圖:



能夠看到,確實(shí)找到了這兩個(gè)神秘?cái)?shù)字,也就是我們的兩個(gè) header structure 找到了。
接著往下分析。

在 三字節(jié)的什么數(shù)字之后,是 1 個(gè)字節(jié)的版本號(hào)(為1),然后是四個(gè)字節(jié)的保留字,在保留字之后,是四個(gè)字節(jié)的整數(shù), 表示在該header structure 中有多少個(gè)索引項(xiàng),也就是說(shuō)
有多少個(gè)index, 接下來(lái)的四個(gè)字節(jié)整數(shù),標(biāo)識(shí)在該header structure 中有多少數(shù)據(jù)。 這些,在上圖都能看到。

header structure 已經(jīng)很清楚了,但是還有兩個(gè)概念沒(méi)清楚,一個(gè)是 index, 一個(gè)是 store,接下來(lái),我們來(lái)剖析這兩個(gè)咚咚。

header structure 之一 ----------- index

每個(gè) index 有 16個(gè) 字節(jié)長(zhǎng)度,前四個(gè)字節(jié)整數(shù)是一個(gè) Tag,表明該 index 指向的數(shù)據(jù)是什么類(lèi)型的,關(guān)于這段描述,原文是:

The first four bytes contain a tag — a numeric value that identifies what type of data is pointed to by the entry. The tag values change according to the header structure's position in the RPM file

這個(gè)很容易讓人誤解為是,這個(gè)類(lèi)型是 整形,字符串,或者數(shù)組,其實(shí)不是,這里的 “TYPE” 其實(shí)就是我們通常說(shuō)的變量名稱(chēng),參考附錄才知道。
其實(shí)就是RPM中的信息要素(我們通過(guò) rpm -qpi xxoo.rpm 看到的咚咚)。
Tag 的值定義列表如下:

  1. #define RPMTAG_NAME                     1000
  2. #define RPMTAG_VERSION                  1001
  3. #define RPMTAG_RELEASE                  1002
  4. #define RPMTAG_SERIAL                   1003
  5. #define RPMTAG_SUMMARY                  1004
  6. #define RPMTAG_DESCRIPTION              1005
  7. #define RPMTAG_BUILDTIME                1006
  8. #define RPMTAG_BUILDHOST                1007
  9. #define RPMTAG_INSTALLTIME              1008
  10. #define RPMTAG_SIZE                     1009
復(fù)制代碼
好了,接下來(lái)的四個(gè)字節(jié)整數(shù)(4-7),才是前四個(gè)字節(jié)的變量的類(lèi)型,整數(shù)啊,字符串啊。。
定義如下(在文件 /usr/include/rpm/header.h 中能看到):

  1. typedef enum rpmTagType_e {
  2. #define RPM_MIN_TYPE            0
  3.     RPM_NULL_TYPE               =  0,
  4.     RPM_CHAR_TYPE               =  1,
  5.     RPM_INT8_TYPE               =  2,
  6.     RPM_INT16_TYPE              =  3,
  7.     RPM_INT32_TYPE              =  4,
  8. /*    RPM_INT64_TYPE    = 5,   ---- These aren't supported (yet) */
  9.     RPM_STRING_TYPE             =  6,
  10.     RPM_BIN_TYPE                =  7,
  11.     RPM_STRING_ARRAY_TYPE       =  8,
  12.     RPM_I18NSTRING_TYPE         =  9
  13. #define RPM_MAX_TYPE            9
  14. } rpmTagType;
復(fù)制代碼
STRNG_TYPE 是空字符結(jié)束的字符串
STRING_ARRAY_TYPE 是 STRING_TYPE 的集合組成。

接下來(lái)的 8 到 11字節(jié)的整數(shù),是該 index 對(duì)應(yīng)的數(shù)據(jù)在 store 段的偏移,當(dāng)然從哪里開(kāi)始算偏移,現(xiàn)在還不清楚,后面再說(shuō)。

最后12-15字節(jié)的整數(shù),表明了該index指向的數(shù)據(jù),有多個(gè)數(shù)據(jù)據(jù)條目,主要是給STRING 和 STRING_ARRY用的,STRING 的話(huà),是1,STRING_ARRY就是STRING的個(gè)數(shù)。

header structure 之二 ----------- store

store 就是 該 header structure 中數(shù)據(jù)存儲(chǔ)的地方,有幾個(gè)點(diǎn)要注意:

(1): 每個(gè) STRING 類(lèi)型,都以 空字符結(jié)尾。
(2): 整數(shù)存儲(chǔ)都是按照它的自然邊界存儲(chǔ)的,翻譯的實(shí)在太拗口了。也就是說(shuō),64位的用8個(gè)字節(jié)存儲(chǔ),16位的用2個(gè)字節(jié)存儲(chǔ),32位的用4個(gè)字節(jié)存儲(chǔ)等等。
(3): 所有數(shù)據(jù)都是網(wǎng)絡(luò)字節(jié)序存儲(chǔ)的。

論壇徽章:
0
15 [報(bào)告]
發(fā)表于 2012-11-16 11:32 |只看該作者
很不錯(cuò)啊,學(xué)習(xí)了。

論壇徽章:
0
16 [報(bào)告]
發(fā)表于 2012-11-16 11:45 |只看該作者
本帖最后由 duanjigang 于 2012-11-16 16:05 編輯

接著來(lái)看由 header structure 組成的 RPM 文件中的兩個(gè)要素:
signature 和 Header

signature 和 header 都是 header structure
看一段我從RPM中取出的元數(shù)據(jù):


  1. 8E AD E8 01 00 00 00 00  00 00 00 05 00 00 00 54 ----第一個(gè)heder,signature 開(kāi)始  5 個(gè) index,0X54 = 84 個(gè)字節(jié)的數(shù)據(jù)存儲(chǔ)在本header
  2. 00 00 00 3E 00 00 00 07  00 00 00 44 00 00 00 10                                  TAG 是 62  PGPTAG_PRIVATE_62         = 62, \/*!< Private or Experimental Values *
  3. 00 00 01 0D 00 00 00 06  00 00 00 00 00 00 00 01                        TAG 是 RPMTAG_R        rpmlib.h        269;"
  4. 00 00 03 E8 00 00 00 04  00 00 00 2C 00 00 00 01             TAG是 1000 RPMSIGTAG_SIZE
  5. 00 00 03 EC 00 00 00 07  00 00 00 30 00 00 00 10         TAG是1004  RPMTAG_SUMMARY
  6. 00 00 03 EF 00 00 00 04  00 00 00 40 00 00 00 01          TAG是RPMTAG_BUILDHOST
  7. 35 62 65 36 33 31 65 38  34 36 31 30 33 63 33 36  
  8. 38 66 34 36 62 30 32 66  64 65 36 34 33 61 32 30  
  9. 63 36 39 62 63 64 38 65  00 00 00 00 00 00 06 DB  
  10. 2A DB 93 17 6D BE D3 9D  4B BE AA 2A 19 88 36 35  
  11. 00 00 01 C0 00 00 00 3E  00 00 00 07 FF FF FF B0  
  12. 00 00 00 10 00 00 00 00  8E AD E8 01 00 00 00 00   ---signature結(jié)束,第二個(gè)header,header開(kāi)始
復(fù)制代碼
第一行是 標(biāo)準(zhǔn)頭,第二行開(kāi)始就是 5 個(gè) index,每行一個(gè)index,每個(gè) index 項(xiàng)都是四個(gè)32為的整數(shù),分別是:

  1. TAG (0-3)         TYPE (4-7)             OFFSET (8-11)           COUNT(12-15)
復(fù)制代碼
有兩個(gè)地方需要注意,我還不是很清楚
(1) 在 lead 結(jié)束時(shí),為什么插入了16個(gè)字節(jié)的空數(shù)據(jù)?
(2) signature 結(jié)束時(shí),84 個(gè) 字節(jié)結(jié)束時(shí),緊接著應(yīng)該是header的開(kāi)頭,可是卻插入了四個(gè)字節(jié)的空數(shù)據(jù),不知道為什么,還是我計(jì)算錯(cuò)了? 還在查找中


然后 signature 字段就此結(jié)束了。

第二個(gè) header 是 Header 字段。

Header字段中包含了 RPM 文件的主要信息,名稱(chēng),版本,文件列表等信息。
因此,在Header的index將會(huì)很多,而且你能看到很多類(lèi)型的 TAG 出現(xiàn) (SPEC文件中的很多元素都會(huì)出現(xiàn))。

貼一段看看:

  1. 00 00 00 10 00 00 00 00  8E AD E8 01 00 00 00 00   ---signature結(jié)束,第二個(gè)header,header開(kāi)始
  2. 00 00 00 31 00 00 02 F6  00 00 00 3F 00 00 00 07  49 個(gè) index 758個(gè)字符的數(shù)據(jù)存儲(chǔ)
  3. 00 00 02 E6 00 00 00 10  00 00 00 64 00 00 00 08  1
  4. 00 00 00 00 00 00 00 01  00 00 03 E8 00 00 00 06  2 -------TAG 1000 RPMTAG_NAME
  5. 00 00 00 02 00 00 00 01  00 00 03 E9 00 00 00 06  3 ------ TAG 1001 RPMTAG_VERSION
  6. 00 00 00 0B 00 00 00 01  00 00 03 EA 00 00 00 06  4  ---- TAG 1002 RPMTAG_RELEASE
  7. 00 00 00 11 00 00 00 01  00 00 03 EB 00 00 00 04  5  ---- TAG 1003 RPMTAG_EPOCH
  8. 00 00 00 14 00 00 00 01  00 00 03 EC 00 00 00 09  6      --- TAG 1004 RPMTAG_SUMMARY
  9. 00 00 00 18 00 00 00 01  00 00 03 ED 00 00 00 09  7
  10. 00 00 00 2F 00 00 00 01  00 00 03 EE 00 00 00 04  8
  11. 00 00 00 48 00 00 00 01  00 00 03 EF 00 00 00 06  9
  12. 00 00 00 4C 00 00 00 01  00 00 03 F1 00 00 00 04  10
  13. 00 00 00 68 00 00 00 01  00 00 03 F3 00 00 00 06  11
  14. 00 00 00 6C 00 00 00 01  00 00 03 F6 00 00 00 06  12
  15. 00 00 00 9A 00 00 00 01  00 00 03 F7 00 00 00 06  13
  16. 00 00 00 C6 00 00 00 01  00 00 03 F8 00 00 00 09  14
  17. 00 00 00 FE 00 00 00 01  00 00 03 FD 00 00 00 06  15
  18. 00 00 01 03 00 00 00 01  00 00 03 FE 00 00 00 06  16
  19. 00 00 01 09 00 00 00 01  00 00 04 04 00 00 00 04  17
  20. 00 00 01 10 00 00 00 02  00 00 04 06 00 00 00 03  18
  21. 00 00 01 18 00 00 00 02  00 00 04 09 00 00 00 03  19
  22. 00 00 01 1C 00 00 00 02  00 00 04 0A 00 00 00 04  20
  23. 00 00 01 20 00 00 00 02  00 00 04 0B 00 00 00 08  21
  24. 00 00 01 28 00 00 00 02  00 00 04 0C 00 00 00 08  22
  25. 00 00 01 6A 00 00 00 02  00 00 04 0D 00 00 00 04  23
  26. 00 00 01 6C 00 00 00 02  00 00 04 0F 00 00 00 08  24
  27. 00 00 01 74 00 00 00 02  00 00 04 10 00 00 00 08  25
  28. 00 00 01 7E 00 00 00 02  00 00 04 14 00 00 00 06  
  29. 00 00 01 88 00 00 00 01  00 00 04 15 00 00 00 04  
復(fù)制代碼
Header 的分析和 signature 類(lèi)似。

論壇徽章:
48
15-16賽季CBA聯(lián)賽之青島
日期:2021-01-07 13:41:2315-16賽季CBA聯(lián)賽之上海
日期:2020-12-01 18:02:0720周年集字徽章-20	
日期:2020-10-28 14:14:2620周年集字徽章-20	
日期:2020-10-28 14:04:3015-16賽季CBA聯(lián)賽之天津
日期:2020-10-18 22:51:412016猴年福章徽章
日期:2016-02-18 15:30:3415-16賽季CBA聯(lián)賽之北控
日期:2015-12-22 13:30:48操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-12-07 06:20:00操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-09-04 06:20:002015亞冠之德黑蘭石油
日期:2015-08-05 18:46:082015年亞洲杯之巴勒斯坦
日期:2015-04-19 10:42:502015年亞洲杯之巴林
日期:2015-04-09 08:03:23
17 [報(bào)告]
發(fā)表于 2012-11-16 15:58 |只看該作者
支持分享!謝謝LZ,占座聽(tīng)講:wink:

論壇徽章:
0
18 [報(bào)告]
發(fā)表于 2012-11-16 16:07 |只看該作者
本帖最后由 duanjigang 于 2012-11-16 16:16 編輯

關(guān)于 RPM_TAG 的所有定義,可以去文件
/usr/include/rpm/rpmlib.h
中查找。

Archive 字段

Header 之后就是 archive 字段,存儲(chǔ)了組成 RPM 的所有文件內(nèi)容,能夠通過(guò)標(biāo)志位 “1F 8B” 看到,archive 部分是通過(guò) gzip
壓縮后存儲(chǔ)的。

  1. 00 3F 00 00 00 07 FF FF  FC F0 00 00 00 10 1F 8B
  2. 08 00 00 00 00 00 00 03  8D 8E BD 0E 82 30 14 46
  3. 3B F3 14 14 F7 72 6F 5B  04 07 07 07 07 13 27 E2
  4. 0B 40 29 C2 20 90 B6 9A  F0 F6 A2 40 34 46 12 4E
  5. 6E 72 FF BE E1 40 0C 31  20 20 AA 04 77 09 0C 24
  6. 58 16 F0 1F 94 25 64 B2  10 D3 5F C8 B1 2F E6 67
  7. F4 3C B0 30 AF 9B D0 69  EB 58 D7 93 0D 0D EF D6
  8. BC 4F 5D EF AA B6 E1 6C  EB 75 A6 6E 9C 1F B8 AA
  9. B6 FE 50 99 FF 4A FB 37  6D 6D 76 D5 81 07 DF BE
  10. D9 E8 9B CB 25 DF 68 D0  8D F8 56 4D AB 58 E7 8B
  11. F0 F1 D5 4E 8D BE AA 6D  4A 42 88 D5 E6 A1 CD 1E
  12. 81 09 CE 90 23 E3 1E 99  9C D6 B1 36 F7 4B 3E 0F
  13. 97 F4 70 3A 1F 53 4A E9  A0 43 9E 3D 9F 06 07 C0
  14. 01 00 00 43 00 74 65 73 74 2D 72  49
復(fù)制代碼
接著的 “08” 表明數(shù)據(jù)是用 gzip 的  “deflation” 方法壓縮的。
如果你想獲取更多的細(xì)節(jié),可以參考 rpmbuild 或者 RPM 的源代碼。

論壇徽章:
0
19 [報(bào)告]
發(fā)表于 2012-11-16 16:47 |只看該作者
本帖最后由 duanjigang 于 2012-11-16 16:56 編輯

test.zip (1.06 KB, 下載次數(shù): 249)



附件的 test.c 是基于 rpm-devel 這個(gè)庫(kù)開(kāi)發(fā)的一個(gè) rpm 信息讀取功能的 C程序,讀取RPM基本信息并且打印,如果你了解了RPM的格式,看這段代碼就比較容易了。
核心代碼片段如下:

  1. char * readHeaderString (Header header, int_32 tag_id)
  2. {
  3.           int_32 type;
  4.           void *pointer;
  5.           int_32 data_size;
  6.           int header_status = headerGetEntry (header, tag_id, &type, &pointer, &data_size);
  7.           if (header_status)
  8.             {
  9.                       if (type == RPM_STRING_TYPE)
  10.                 {
  11.                           return pointer;
  12.                 }
  13.             }
  14.           return NULL;
  15. }

  16. int samplerpm (const char *szrpm)
  17. {
  18.         char g_szname[1024] = {0};
  19.         FD_t fd = Fopen (szrpm, "r");
  20.         memset (g_szname, 0, 1024);
  21.         sprintf (g_szname, "%s", szrpm);
  22.         fflush (stdin);
  23.         fflush (stdout);
  24.           if (!fd)
  25.             {
  26.                       printf ("open file '%s' failed\n", szrpm);
  27.                       return 0;
  28.             }
  29.            //else
  30.             // printf ("open '%s' success\n", szrpm);
  31.    
  32.           struct rpmlead plead;
  33.           int lead = readLead (fd, &plead);

  34.           if (lead)
  35.             {
  36.                       printf ("readLead of '%s' failed\n", szrpm);
  37.                       Fclose (fd);
  38.                       return 0;
  39.             }
  40.           else
  41.             {
  42.                               //printf ("name=%s,may=%d,min=%d\n",plead.name,plead.major,plead.minor);
  43.             }

  44.           //sigType sig_type = plead.signature_type;
  45.           Header header;
  46.           rpmRC ret = rpmReadSignature (fd, &header, plead.signature_type);

  47.           if (ret != RPMRC_OK)
  48.             {
  49.                       printf ("rpmReadSignature of '%s' failed\n", szrpm);
  50.                       Fclose (fd);
  51.                       return 0;
  52.             }
  53.           //else
  54.           //printf ("rpmReadSignature success:%s\n", szrpm);
  55.           //read header
  56.           Header newheader =
  57.             headerRead (fd, (plead.major >= 3) ? HEADER_MAGIC_YES : HEADER_MAGIC_NO);
  58.           if (!newheader)
  59.             {
  60.                       printf ("headerRead of '%s' failed\n", szrpm);
  61.                       Fclose (fd);
  62.                       return 0;
  63.             }
  64.         const char *name = readHeaderString (newheader, RPMTAG_NAME);
  65.           const char *version = readHeaderString (newheader, RPMTAG_VERSION);
  66.           const char *release = readHeaderString (newheader, RPMTAG_RELEASE);
  67.           const char *group = readHeaderString (newheader, RPMTAG_GROUP);
  68.           const char *packager = readHeaderString (newheader, RPMTAG_PACKAGER);

  69.         if (!group) group = "NONE_GROUP";
  70.         if (!packager) packager = "NONE_PACKAGER";
  71.         printf ("name:%s\nversion:%s\nrelease:%s\ngroup:%s\npackager:%s\n\n",
  72.         name, version, release, group, packager);
  73.           Fclose (fd);
  74.           return 1;
  75. }
  76. [code]

  77. 執(zhí)行編譯命令:

  78. [code]
  79. gcc test.c -I/usr/include/rpm -lrpm -lrpmdb -lrpmio -lpopt -o test_rpm
復(fù)制代碼
然后可以測(cè)試其功能:

  1. ./test_rpm ./mysql-server-5.0.77-4.el5_6.6.x86_64.rpm
  2. name:mysql-server
  3. version:5.0.77
  4. release:4.el5_6.6
  5. group:Applications/Databases
  6. packager:Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
復(fù)制代碼
本人沒(méi)有讀 rpm 的源碼,不過(guò)其實(shí)現(xiàn)應(yīng)該也類(lèi)似,參考 RPM 的協(xié)議文檔,逐個(gè)做解析吧。

到此為止, RPM 文件的介紹和格式剖析基本上結(jié)束。關(guān)于 RPM 的操作工具,可以參考 man 手冊(cè)。
或者有空時(shí),我再來(lái)補(bǔ)充,等對(duì) spec 文件做整理后,我會(huì)把 Spec 的部分總結(jié)出來(lái)。


:wink:  over  

論壇徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵節(jié)徽章
日期:2015-03-06 15:50:392015亞冠之大阪鋼巴
日期:2015-06-12 16:01:352015年中國(guó)系統(tǒng)架構(gòu)師大會(huì)
日期:2015-06-29 16:11:2815-16賽季CBA聯(lián)賽之四川
日期:2018-12-17 14:10:21
20 [報(bào)告]
發(fā)表于 2012-11-16 16:57 |只看該作者
終于寫(xiě)完了,看過(guò)以后,學(xué)到了不少啊
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP