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

Chinaunix

標(biāo)題: 關(guān)于getprotobyname [打印本頁(yè)]

作者: hohoxu_hao115    時(shí)間: 2007-08-10 14:12
標(biāo)題: 關(guān)于getprotobyname
還有g(shù)etprotoent,getprotobynumber等,它們都返回一個(gè)指向struct protoent結(jié)構(gòu)變量的指針,那么這個(gè)變量的空間是在哪分配的?不用free嗎?
程序結(jié)束后,它會(huì)自動(dòng)free嗎?
作者: 福瑞哈哥    時(shí)間: 2007-08-10 14:32
調(diào)用者不需要free。
作者: fcloudf    時(shí)間: 2007-08-10 14:32
不用free 靜態(tài)空間
作者: hohoxu_hao115    時(shí)間: 2007-08-10 14:46
謝謝。
現(xiàn)在好像有了getprotobyname_r等_r后綴的函數(shù),可能更好一些。不過程序員手冊(cè)里沒有說明。
作者: caijimin    時(shí)間: 2007-08-10 14:48
man里面自己寫的,
     These functions use a static data space; if the data is needed for future
     use, it should be copied before any subsequent calls overwrite it.  

和inet_ntoa()類似,比如printf("%s %s", inet_ntoa(sip), inet_ntoa(dip));想打印源ip和目的ip
就會(huì)打印出同一個(gè)字符串,要分成2句才行
作者: 福瑞哈哥    時(shí)間: 2007-08-10 14:54
原帖由 caijimin 于 2007-8-10 14:48 發(fā)表
man里面自己寫的,
     These functions use a static data space; if the data is needed for future
     use, it should be copied before any subsequent calls overwrite it.  

和inet_ntoa()類似, ...

你用的是什么系統(tǒng)?手冊(cè)描述的比我的系統(tǒng)好。
作者: hohoxu_hao115    時(shí)間: 2007-08-10 15:04
Linux程序員手冊(cè)對(duì)inet_ntoa的空間分配方式有說明。對(duì)getprotobyname好像沒有。
作者: caijimin    時(shí)間: 2007-08-10 17:45
你用的是什么系統(tǒng)?手冊(cè)描述的比我的系統(tǒng)好。


FreeBSD
作者: ivhb    時(shí)間: 2007-08-10 18:50
原帖由 caijimin 于 2007-8-10 17:45 發(fā)表


FreeBSD

linux也有的。
比如man 3p getprotoent

APPLICATION USAGE
       The   getprotobyname(),  getprotobynumber(),  and  getpro-
       toent() functions may  return  pointers  to  static  data,
       which  may  be  overwritten  by subsequent calls to any of
       these functions.

作者: ivhb    時(shí)間: 2007-08-10 18:51
原帖由 hohoxu_hao115 于 2007-8-10 14:46 發(fā)表
謝謝。
現(xiàn)在好像有了getprotobyname_r等_r后綴的函數(shù),可能更好一些。不過程序員手冊(cè)里沒有說明。


哥們,那些是已經(jīng)過時(shí)的,不推薦的。只是為了兼容以前的軟件保留的接口。還是不用_r的吧
作者: ivhb    時(shí)間: 2007-08-10 18:55
原帖由 hohoxu_hao115 于 2007-8-10 15:04 發(fā)表
Linux程序員手冊(cè)對(duì)inet_ntoa的空間分配方式有說明。對(duì)getprotobyname好像沒有。


對(duì)于unix,下面的描述基本上是一個(gè)規(guī)則:
對(duì)于固定結(jié)構(gòu)的條目的讀取,庫(kù)不會(huì)使用malloc,因?yàn)閹?kù)的設(shè)計(jì)者比你更早知道這個(gè)結(jié)構(gòu)的精確定義,需要占用的空間。
因此可以設(shè)計(jì)成static的一個(gè)storage,加以封裝。比如你的getprotobyname, getpw*系列。都屬于這個(gè)類型。并且
結(jié)構(gòu)的每個(gè)分量的長(zhǎng)度都是有個(gè)最大長(zhǎng)度的限制(比如路徑,有PATH_MAX來限制...)。因此,幾乎可以肯定的是,沒有必要用malloc來實(shí)現(xiàn),給自己添麻煩。
strdup之所以不能這么做,因?yàn)樗恢滥銈魅氲淖执降锥嚅L(zhǎng)(換句話說,不是固定的條目)。因此調(diào)用了malloc來實(shí)現(xiàn)。
這么描述,希望以后沒有這個(gè)困擾。多一個(gè)直覺性的判斷。

[ 本帖最后由 ivhb 于 2007-8-10 19:43 編輯 ]
作者: hohoxu_hao115    時(shí)間: 2007-08-13 08:54
謝謝。
知道了,lfs的conf文件沒把3p加進(jìn)去。
作者: honeasy    時(shí)間: 2014-03-25 15:18
ivhb 發(fā)表于 2007-08-10 18:51
哥們,那些是已經(jīng)過時(shí)的,不推薦的。只是為了兼容以前的軟件保留的接口。還是不用_r的吧


此言差矣,_r 版本的函數(shù)是可重入的線程安全版本。故而如果如果你程序是在多線程環(huán)境下運(yùn)行,getprotobyname是有一定風(fēng)險(xiǎn)的,而應(yīng)該用自備緩沖區(qū)的 _r可重入版本。




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2