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