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中有很多函数将指针指向结构。如何在函数调用后确定是否可以释放结构?
答案 0 :(得分:6)
是的,你可以这样做。 bind
是一个同步系统调用,所以一旦它返回,内核就完成了所有参数。
如果套接字是非阻塞的并且bind
返回EINPROGRESS
以指示绑定是异步发生的,那么释放结构仍然是安全的。当操作异步完成时,内核会在内部复制结构。
如何在函数调用后确定是否可以释放结构?
阅读文档。大多数POSIX函数是同步的,并且在函数返回后可以安全地释放参数,但这并不总是正确的。如果您不确定,请阅读文档。显然,如果程序中有多个线程,则在API调用正在进行时,不应同时从另一个线程修改数据。