nginx 開發時 off t 大小不一致問題

2021-06-20 19:01:15 字數 1103 閱讀 6598

c語言的包含關係是非常考驗人的問題,大多數c,c++程式設計師應該都遇到過包含順序問題導致的編譯問題,而本文的問題則更隱蔽,是包含順序問題引起的執行時問題。

主要表現是,由於巨集定義的先後順序,影響了資料結構,導致不同的檔案中,相同的資料結構大小卻不一樣。

最近在寫乙個nginx敏感詞過濾模組時,出現乙個奇怪的現象:

在方法內創始乙個物件,對其賦值後,返回,在呼叫的地方值變成了。物件本身的位址並沒有變。只是結構體裡面的大部分屬性值改變了。

經過一系列的打日誌,除錯,發現同乙個結構體ngx_buf_t 在不同的檔案裡面,大小是不同的。這讓我想起來以前寫乙個nginx的tcp模組時,也遇到同樣的問題,乙個結構體在不同的檔案中,大小不一樣,後面追蹤到主要是資料結構中的off_t型別在兩個檔案中大小不一致。當時由於時間關係,並沒有詳查原因,只是很簡單的把資料結構中的off_t 改變成了uint64_t。

這次除錯後發現:

在ngx_buf.c中 sizeof(off_t)為8位元組。

在自己寫的模組**裡面sizeof(off_t)為4位元組。

後來在網上搜尋相關資訊,發現有乙個巨集_file_offset_bits可以控制off_t結構的大小。當定義這個巨集之後off_t就使用的是64位的:

/usr/include/features.h 

#if defined _file_offset_bits && _file_offset_bits == 64

# define __use_file_offset64    1

#endif

而nginx中剛好定義了這個巨集:

./src/os/unix/ngx_linux_config.h:16:#define _file_offset_bits  64

這樣問題就比較清楚了,應該是在我的源**中,先包含linux下的標頭檔案,而此時還沒有定義_file_offset_bits。所以在我自己寫的源**中sizeof(off_t)是4位元組,而nginx**中,由於已經定義了這個巨集,sizeof(off_t)就是8位元組了。

就這樣,我把我的源**中的包含順序調換了下,把nginx相應的標頭檔案先包含,然後再包含系統的標頭檔案。(這樣在系統的標頭檔案中就能感知到__use_file_offset64巨集的存在)。

PDF頁面大小不一致怎麼辦?

在pdf格式轉換的過程中遇到各種問題,比如轉換出現亂碼 轉出來的檔案是無法編輯 轉換時提示檔案許可權不足等等,今天我就來和大家介紹pdf文件頁面大小不一致常用兩種種解決方。第一種方法 通過文件 裁剪頁面來統一pdf頁面大小 執行adobeacrobatxpro,開啟需要處理的pdf檔案,在轉換介面左...

ls h du sh的大小顯示不一致原因

近期在學習中偶然發現 ls h du sh的大小顯示不一致具體如下 root localhost ll h 總用量 20k rw r r 1 root root 3.8k 1月 7 08 17 1.txt rw 1 root root 1.4k 4月 27 2020 anaconda ks.cfg ...

軟體心得 銷帳時餘額不一致問題

目錄問題 分析 解決 今天碰到的問題現象描述如下 客戶陳強,據說是銷帳過程中,頁面卡了一下,然後重新整理以後,發現提款明細報表裡,餘額資料不對,多減了一筆當前銷帳的資料。查過 這個操作是乙個事務處理,按理說,不應該出現資料不一致的情況。唯一的可能就是當網路卡頓時,第一筆提交資料中的銷帳標記仍沒有成功...