[英]Linux Socket file descriptor with threads
consider following situation: One thread (lets call it A) initialises, sets socket state with listen()
and then wait with accept()
. 考虑以下情况:一个线程(称为A)进行初始化,使用
listen()
设置套接字状态,然后使用accept()
等待。 Connection arrives to A socket, accept()
returns valid fd. 连接到达一个套接字,
accept()
返回有效的fd。 New thread (B) is created (using std::thread
), and acquired fd is passed to a callable object witch runs in thread B. Reading (using read()
) for fd fails and errno
is set to 9 EBADFD
. 创建新线程(B)(使用
std::thread
),并将获取的fd传递给线程B中运行的可调用对象。读取(使用read()
)获取fd失败,并且errno
设置为9 EBADFD
。 Thread A calls join()
on B. When B is not spawned and fd is used (still via same callable object) read completes without failure. 线程A调用B上的
join()
。未生成B并使用fd(仍通过同一可调用对象)时,读取完成而没有失败。 Why? 为什么? Below is some code to illustrate this situation.
下面是一些代码来说明这种情况。
BaseFun::BaseFun(char* bufferAdr, int socket):
socket_fd(socket)
buffer(bufferAdr)
{}
BaseFun::~BaseFun()
{
close(socket_fd);
}
char* BaseFun::buffer_read()
{
if(read(socket_fd, buffer, BUFF_SIZE-1) < 0) {
std::cout<<"ERROR while READ\n"<<"ERRNO: "<<errno<<"\n"<<"FD: "<<socket_fd<<"\n";
}
return buffer;
}
DisplayMsgFun::DisplayMsgFun(char* buffer, int socket) :
BaseFun(buffer, socket)
{}
void DisplayMsgFunFun::operator()()
{
std::cout<<"Message:\n\t"<<buffer_read()<<"\nEND\n";
}
Snippet where above is called: 上面的代码段称为:
void Server::server_run()
{
sockaddr_in client_addr;
socklen_t c_len = sizeof(client_addr);
client_fd = accept(sock_fd, (sockaddr*)&client_addr, &c_len);
DisplayMsgFun dm(server_buffers->front().data(), client_fd);
std::thread job(dm);
job.join();
}
And main()
和
main()
int main()
{
Server srv(PORT);
if (srv.server_create()) {
std::cout << "Server bind!\n";
srv.server_run();
}
else {
std::cout << "Bind fail! ERRNO: "<<errno<<"\n";
return -1;
}
return 0;
}
您似乎正在将DisplayMsgFun
对象的副本传递给std::thread
构造函数,这意味着原始副本被销毁,每个析构函数自动调用::close
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.