2015-03-19 47 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开始。

这也是说,你试图做的应该工作。如果不是,那么除非你澄清你的意思是“它不工作”,否则没人能回答你的问题。

相关问题