2

bind()函数const struct sockaddr *addr作为参数之一。我可以传递一个临时sockaddr结构,它会在bind()调用后立即被删除吗?

void bindMe(int socket) {
    struct sockaddr_in addr = {...};
    bind(socket, (struct sockaddr_in*)&addr, sizeof(sockaddr_in));
}
// addr is no more exist after function calling, 
// but I still want to work with the socket.

此外,POSIX 中有很多函数都指向结构。如何确定函数调用后是否可以释放结构?

4

1 回答 1

6

是的,你可以这么做。 bind是同步系统调用,所以一旦返回,内核就全部用参数完成了。

如果套接字是非阻塞的并bind返回EINPROGRESS以指示绑定正在异步发生,则释放结构仍然是安全的。当操作异步完成时,内核在内部复制结构。

如何确定函数调用后是否可以释放结构?

阅读文档。大多数 POSIX 函数是同步的,并且可以在函数返回后安全地释放参数,但这并不总是正确的。如果您不确定,请阅读文档。显然,如果您的程序中有多个线程,则不应在进行 API 调用时同时修改来自另一个线程的数据。

于 2012-10-01T20:52:32.897 回答