我正在开发一个客户端程序,它将作为基本的即时通讯工具运行。我正在使用pthread打开一个专门用于等待接收消息和要读取的消息的线程。是否使用pthread_cond_wait正确等待read(sockfd, buffer, 256)
大于0?
void *threadRead() {
while (1) {
bzero(buffer,256);
pthread_cond_wait(&buffer_lock, read(sockfd, buffer, 255) > 0);
n = read(sockfd, buffer, 255);
printf("%s\n",buffer);
}
}
你知道我只需要等到read()
返回0
以上的值才能继续,我无法找到合适的系统来做到这一点。如果有人可以链接一些能让我走上正轨的东西,或者给我一个很棒的提示。
答案 0 :(得分:1)
没有。 pthread_cond_wait()
用于等待一个由其他线程更改的条件。
如果您只想等待read()
返回某些内容,请致电read()
。除非你特意将套接字标记为非阻塞,否则它将阻塞调用线程,直到有东西返回。
如果read()
永远返回0,那么它表示文件结束:这意味着套接字已在远程端关闭,因此永远不会再有读取。
答案 1 :(得分:-1)
您应该使用select()
,而不是像这样
int running;
running = 1;
while (running != 0) /* Just in case you want to end the loop, you can */
{
fd_set rdset;
struct timeval timeout;
timeout.tv_sec = NUMBER_OF_SECONDS_TO_WAIT;
timeout.tv_usec = YOU_CAN_HAVE_MICRO_SECONDS_PRECISION;
FD_ZERO(&rdset);
FD_SET(fd, &rdset);
if (select(fd + 1, &rdset, NULL, NULL, &timeout) == 1)
{
ssize_t length;
char buffer[100];
length = read(fd, buffer, sizeof(buffer));
/* use buffer now */
}
else
{
/* Timed out and still nothing to read */
/* do something meanwhile and retry if */
/* you want to. */
}
running = use_a_function_to_check_this();
}
你可以在不同的线程中使用它,但你需要小心。
非阻塞IO很难,但实施起来并不重要。
还有一件事,这个
n = read(sockfd, buffer, 255);
printf("%s\n",buffer);
可能是未定义的行为,因为显然缓冲区是
char buffer[256];
你可以
n = read(sockfd, buffer, 255 /* or sizeof(buffer) - 1 */);
buffer[n] = '\0';
printf("%s\n",buffer);
确保buffer
nul
终止。