2015-03-19 63 views
0

我有一個文件描述符(基本上是套接字描述符)示例sockfd。我用dup2命令 (void)dup2(sockfd,0);使用dup2複製文件描述符,然後用close關閉它

然後我關閉描述符close(sockfd);

現在我嘗試收到接收消息recv(0,buf,sizeof(buf),0);

但它不工作有什麼問題嗎?

+0

除了Celada的回答以下,稍微偏離主題,但仍然很重要:您似乎誤解了sizeof(buf)'實際上做了什麼。 'buf'是一個指向緩衝區的指針,所以它的大小可能總是爲4(32位)或8(64位),而* *不是由緩衝區分配的大小。 – ayekat

+0

@ayekat'sizeof(buf)'如果'buf'是例如一個數組局部變量,就可以正常工作。例如,如果它的聲明和'char buf [30]'在同一個函數中,'sizeof(buf)'將會是30.對於'read','recv'等使用的緩衝區來說,這實際上是很常見的。 .. – Celada

+0

@Celada哎呀,謝謝你指出。 – ayekat

回答

7

dup2不返回void,它返回int,所以你應該檢查它的返回碼。如果dup2由於某種原因失敗了,那就是問題,那麼你就不會知道它。這就是說,dup2通常始終有效。

有一個角落案例可能會導致你所看到的:如果sockfd已經是0.然後你將dup2 0到0,然後關閉0,讓你沒有任何文件描述符。因此,在使用dup2來檢查您嘗試重新編號的文件描述符是否已正確編號之前,這是一種很好的做法。但是,再次,這不可能在你的情況下比sockfd是0開始。

這也是說,你試圖做的應該工作。如果不是,那麼除非你澄清你的意思是「它不工作」,否則沒人能回答你的問題。

相關問題