0
我有一個文件描述符(基本上是套接字描述符)示例sockfd。我用dup2命令 (void)dup2(sockfd,0);使用dup2複製文件描述符,然後用close關閉它
然後我關閉描述符close(sockfd);
現在我嘗試收到接收消息recv(0,buf,sizeof(buf),0);
但它不工作有什麼問題嗎?
我有一個文件描述符(基本上是套接字描述符)示例sockfd。我用dup2命令 (void)dup2(sockfd,0);使用dup2複製文件描述符,然後用close關閉它
然後我關閉描述符close(sockfd);
現在我嘗試收到接收消息recv(0,buf,sizeof(buf),0);
但它不工作有什麼問題嗎?
dup2
不返回void
,它返回int
,所以你應該檢查它的返回碼。如果dup2
由於某種原因失敗了,那就是問題,那麼你就不會知道它。這就是說,dup2
通常始終有效。
有一個角落案例可能會導致你所看到的:如果sockfd
已經是0.然後你將dup2
0到0,然後關閉0,讓你沒有任何文件描述符。因此,在使用dup2
來檢查您嘗試重新編號的文件描述符是否已正確編號之前,這是一種很好的做法。但是,再次,這不可能在你的情況下比sockfd
是0開始。
這也是說,你試圖做的應該工作。如果不是,那麼除非你澄清你的意思是「它不工作」,否則沒人能回答你的問題。
除了Celada的回答以下,稍微偏離主題,但仍然很重要:您似乎誤解了sizeof(buf)'實際上做了什麼。 'buf'是一個指向緩衝區的指針,所以它的大小可能總是爲4(32位)或8(64位),而* *不是由緩衝區分配的大小。 – ayekat
@ayekat'sizeof(buf)'如果'buf'是例如一個數組局部變量,就可以正常工作。例如,如果它的聲明和'char buf [30]'在同一個函數中,'sizeof(buf)'將會是30.對於'read','recv'等使用的緩衝區來說,這實際上是很常見的。 .. – Celada
@Celada哎呀,謝謝你指出。 – ayekat