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

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

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3900 | 回復(fù): 8
打印 上一主題 下一主題

dup2的實現(xiàn)? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-01-30 17:42 |只看該作者 |倒序瀏覽
今天看到APUE上有一個習(xí)題:
編寫一個與dup2功能相同的函數(shù),要求不調(diào)用fcntl杉樹,并要有正確的出錯處理。
int dup2(int oldfd, int newfd);

想了半天不知道怎么實現(xiàn),關(guān)鍵的問題是,怎么create出一個fd剛好等于newfd。
內(nèi)核實現(xiàn)的時候直接把進(jìn)程表中的newfd下標(biāo)的值改了就是,但是這里肯定不能這樣實現(xiàn)。
難道需要重復(fù)調(diào)用dup,直到dup返回的值等于newfd,然后在close掉dup產(chǎn)生的其它fd?

論壇徽章:
0
2 [報告]
發(fā)表于 2008-01-30 18:31 |只看該作者
頂一下,怎么沒有人回答呢

論壇徽章:
0
3 [報告]
發(fā)表于 2008-01-30 19:11 |只看該作者
好像除了重復(fù)調(diào)用dup(),還真的沒有什么好辦法

論壇徽章:
0
4 [報告]
發(fā)表于 2009-01-30 19:12 |只看該作者
前段時間剛好也看那兒,自己寫了個
很簡陋,效率不高

int mydup2(int oldfd, int newfd)
{
  int tfd;
  
  if (oldfd == newfd)
    return oldfd;

  close(newfd);

  if ((tfd = dup(oldfd)) == newfd) {
    return newfd;
  }
  else {
    mydup2(oldfd, newfd);
    close(tfd);
  }

  return newfd;
}


[ 本帖最后由 logicBaby 于 2009-1-31 01:13 編輯 ]

論壇徽章:
0
5 [報告]
發(fā)表于 2009-01-31 02:34 |只看該作者
int mydup2(int oldfd, int newfd)
{
  int tfd,i=0;
  int *fdp=(int *)malloc((oldfd>newfd)?oldfd:newfd);

  if (oldfd == newfd)
    return oldfd;

  close(newfd);

  do {
    fdp[i]=dup(oldfd);
  }while(fdp[i++] != newfd);

  newfd=fdp[--i];

  for(i--;i > 0 ;i--)
    close(fdp[i]);

  return newfd;

}

不用遞歸的,感覺越寫越亂 

論壇徽章:
0
6 [報告]
發(fā)表于 2009-01-31 15:17 |只看該作者

回復(fù) #5 logicBaby 的帖子

假定 max(oldfd, newfd) == 32767,只有單個 dup2() 請求,你是不是準(zhǔn)備創(chuàng)建 2^(15+2) 個字節(jié)大小的數(shù)組呢?
所以……從這個角度來講,個人覺得簡單一點最好,就是按照順序一個個來,先 close 再一個個 dup,最后把不必要的 fd 統(tǒng)統(tǒng)關(guān)閉。

P.S. 這里的 malloc(),傳給它的參數(shù)應(yīng)該乘個 sizeof(int)?

論壇徽章:
0
7 [報告]
發(fā)表于 2009-01-31 19:46 |只看該作者
原帖由 langue 于 2009-1-31 15:17 發(fā)表
假定 max(oldfd, newfd) == 32767,只有單個 dup2() 請求,你是不是準(zhǔn)備創(chuàng)建 2^(15+2) 個字節(jié)大小的數(shù)組呢?
所以……從這個角度來講,個人覺得簡單一點最好,就是按照順序一個個來,先 close 再一個個 dup,最后把不必要的 fd 統(tǒng)統(tǒng)關(guān)閉。

P.S. 這里的 malloc(),傳給它的參數(shù)應(yīng)該乘個 sizeof(int)


"先 close 再一個個 dup"

因為不知道哪些描述符已經(jīng)打開,之前是否已經(jīng)用過dup2打開過一個指定的描述符,且dup返回的描述符是系統(tǒng)自動返回當(dāng)前可用描述符的最小,這個最小是多少?只有系統(tǒng)知道。所以出此下策,先將所有試過的描述符存起來,然后再關(guān)閉……

“malloc(),傳給它的參數(shù)應(yīng)該乘個 sizeof(int)”

這個確實應(yīng)該加上,謝謝langue指出      
int *fdp = (int *) malloc(sizeof(int) * (oldfd > newfd ? oldfd : newfd));


langue 大大 給個思路,俺只能想到這種一個個試的笨辦法  

[ 本帖最后由 logicBaby 于 2009-1-31 19:48 編輯 ]

論壇徽章:
0
8 [報告]
發(fā)表于 2009-02-02 09:34 |只看該作者
偶也有同樣的問題!

[ 本帖最后由 李某人 于 2009-2-2 09:35 編輯 ]

論壇徽章:
0
9 [報告]
發(fā)表于 2009-02-02 09:36 |只看該作者
  哪個才是正確的思路呢

[ 本帖最后由 李某人 于 2009-2-2 09:37 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP