我正在尝试制作一个简单的客户端 - 服务器聊天程序。在客户端,我分离出另一个线程来读取来自服务器的任何传入数据。问题是,当一个人从主线程注销时,我想优雅地终止第二个线程。我试图使用共享变量'running'来终止,问题是,socket read()命令是一个阻塞命令,所以如果我这样做(运行== 1),服务器必须在读取返回之前发送一些内容并且可以再次检查时间条件。我正在寻找一种方法(只有常见的unix套接字)来执行非阻塞式读取,基本上某种形式的peek()可以工作,因为我可以不断检查循环以查看是否完成。C- Unix套接字 - 无阻塞读取
阅读线程循环如下,现在它没有共享变量的任何互斥量,但我打算补充,以后不用担心! ;)
void *serverlisten(void *vargp)
{
while(running == 1)
{
read(socket, readbuffer, sizeof(readbuffer));
printf("CLIENT RECIEVED: %s\n", readbuffer);
}
pthread_exit(NULL);
}
sd + 1在这种情况下意味着什么?我像这样运行它,并且它能够工作,但它会像循环20次那样循环,然后停止,直到创建新输入,但它像我想要的那样优雅地终止,唯一的问题是20次。它几乎就像它在超时或运行期间运行的那样 – will
您可以在终端中输入“man select”以获取选择功能的详细说明。因为在这里我们只有一个描述符,所以我只写(sd + 1)。 – fghj
大约20次不了解说明。我的代码在你的第一个问题的上下文应该是这样的:1)检查标志(退出的时间?)2)睡眠直到输入或超时3)读取一些东西4)goto(1)。所以它会延迟退出。但是你应该处理另一方关闭连接时的情况,然后选择返回控制给你,但是“读取”将读取0字节,并且你得到了繁忙循环。所以你应该检查“read”的结果,如果它为零,则退出循环。 – fghj