我正在使用epoll进行网络编程,我有这段代码。
int str_len = read(m_events[i].data.fd, buf, BUF_SIZE);
printf("read %d \n", str_len);
if(str_len == 0){
if(!removeClient(m_events[i].data.fd))
break;
close(m_events[i].data.fd);
}
else {
printf("ServerManager::eventAcceptLoop, A message has been received \n");
pushWork(buf);
}
buf声明如下
buf[BUF_SIZE];
我希望将buf中的数据传递给函数“pushWork”
pushWork(char * pdata){
hand this pdata to the thread pool to parse and handle it
}
我认为我需要复制buf中的数据而不是指向buf,因为每当有新数据进入时它都会被覆盖。现在我做的事情就像
char *pdata = buf;
pushWork(pdata)
我应该做memcopy还是别的什么?并冲洗buf? 请让我知道如何处理这个问题。提前谢谢......
答案 0 :(得分:1)
是的,您可以复制数据:
char* pdata = new char[str_len];
memcpy(pdata, buf, str_len);
pushWork(pdata);
在pushWork
结束时,它必须在完成后处理数据:
delete[] pdata;
您还需要考虑将此全部封装到std::vector
中,这样您就不必担心异常安全了:
std::vector<char> data(buf, buf + str_len);
pushWork(data);
在这种情况下,需要修改pushWork以按值std::vector
获取,但好处是它不必担心完成后删除数据,并且将是完全异常安全的。