使用 pthreads 在客户端-服务器设置中终止客户端线程
Terminating client threads in a client-server setup using pthreads
我制作了一个简单的聊天服务器程序,它使用多个线程来处理多个客户端。一旦我启动我的服务器,许多客户端将连接到服务器,因此将创建多个线程。现在,有时我会关闭服务器。
是否会销毁创建的所有线程?我如何检查任何线程是活的还是死的?我正在 Linux 平台上工作。
Server.c:
//for running type ./a.out anyportnumber
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <signal.h>
int s2;
int arr[100];
int tc = 0;
int flag = 1;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void handler(int signal)
{
flag = 0;
}
void sendtoall(char *msg,int s1)
{
int i;
pthread_mutex_lock(&mutex);
for(i = 0; i < tc; i++) {
if(arr[i] != s1)
write(arr[i],msg,strlen(msg));
}
pthread_mutex_unlock(&mutex);
}
void *function(void *s)
{
int s1;
int n;
char rmsg[500];
s1 = *(int *)s;
while((n = read(s1,rmsg,500)) > 0) {
if(flag == 0) {
break;
}
rmsg[n] = '[=10=]';
sendtoall(rmsg,s1);
bzero(rmsg,500);
}
pthread_exit(NULL);
}
int main(int arrc,char *argv[])
{
struct sockaddr_in server,client;
int s1,len;
int n;
int port;
pthread_t t1;
char message[500];
port = atoi(argv[1]);
bzero((char *)&server,sizeof(server));
server.sin_port = htons(port);
server.sin_addr.s_addr = INADDR_ANY;
server.sin_family = AF_INET;
s1 = socket(AF_INET,SOCK_STREAM,0);
if(s1 == -1) {
perror("socket not created\n");
exit(1);
}
if(bind(s1,(struct sockaddr *)&server,sizeof(struct sockaddr)) == -1) {
perror("socket not binded\n");
exit(1);
}
if(listen(s1,5) == -1) {
perror("unable to listen");
exit(1);
}
len = sizeof(struct sockaddr_in);
signal(SIGINT, handler);
while(1) {
if(flag == 0) {
break;
}
s2 = accept(s1,(struct sockaddr *)&client,&len);
pthread_create(&t1,NULL,function,(void *)&s2);
arr[tc] = s2;
tc++;
}
close(s1);
close(s2);
return 0;
}
简短的回答是:当主进程退出时,所有线程也会死亡。
但是在您的代码中,我没有看到任何 "closing" 服务器。您只是在无限循环中创建线程,代码中存在许多问题:
- 不检查线程创建是否成功。
- 可能会超出数组
arr
(只能处理 100 个元素)。
- 只加入最后创建的,这实际上是一个不可达的声明。
- 正在访问
rmsg[n] = '[=11=]';
,这是 UB 的潜在候选对象。如果 read(2)
读取 500 个字符,那么 n
将是 500
而 rmsg[n] = '[=11=]';
是 out-of-bounds 访问。
我制作了一个简单的聊天服务器程序,它使用多个线程来处理多个客户端。一旦我启动我的服务器,许多客户端将连接到服务器,因此将创建多个线程。现在,有时我会关闭服务器。
是否会销毁创建的所有线程?我如何检查任何线程是活的还是死的?我正在 Linux 平台上工作。
Server.c:
//for running type ./a.out anyportnumber
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <signal.h>
int s2;
int arr[100];
int tc = 0;
int flag = 1;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void handler(int signal)
{
flag = 0;
}
void sendtoall(char *msg,int s1)
{
int i;
pthread_mutex_lock(&mutex);
for(i = 0; i < tc; i++) {
if(arr[i] != s1)
write(arr[i],msg,strlen(msg));
}
pthread_mutex_unlock(&mutex);
}
void *function(void *s)
{
int s1;
int n;
char rmsg[500];
s1 = *(int *)s;
while((n = read(s1,rmsg,500)) > 0) {
if(flag == 0) {
break;
}
rmsg[n] = '[=10=]';
sendtoall(rmsg,s1);
bzero(rmsg,500);
}
pthread_exit(NULL);
}
int main(int arrc,char *argv[])
{
struct sockaddr_in server,client;
int s1,len;
int n;
int port;
pthread_t t1;
char message[500];
port = atoi(argv[1]);
bzero((char *)&server,sizeof(server));
server.sin_port = htons(port);
server.sin_addr.s_addr = INADDR_ANY;
server.sin_family = AF_INET;
s1 = socket(AF_INET,SOCK_STREAM,0);
if(s1 == -1) {
perror("socket not created\n");
exit(1);
}
if(bind(s1,(struct sockaddr *)&server,sizeof(struct sockaddr)) == -1) {
perror("socket not binded\n");
exit(1);
}
if(listen(s1,5) == -1) {
perror("unable to listen");
exit(1);
}
len = sizeof(struct sockaddr_in);
signal(SIGINT, handler);
while(1) {
if(flag == 0) {
break;
}
s2 = accept(s1,(struct sockaddr *)&client,&len);
pthread_create(&t1,NULL,function,(void *)&s2);
arr[tc] = s2;
tc++;
}
close(s1);
close(s2);
return 0;
}
简短的回答是:当主进程退出时,所有线程也会死亡。
但是在您的代码中,我没有看到任何 "closing" 服务器。您只是在无限循环中创建线程,代码中存在许多问题:
- 不检查线程创建是否成功。
- 可能会超出数组
arr
(只能处理 100 个元素)。 - 只加入最后创建的,这实际上是一个不可达的声明。
- 正在访问
rmsg[n] = '[=11=]';
,这是 UB 的潜在候选对象。如果read(2)
读取 500 个字符,那么n
将是500
而rmsg[n] = '[=11=]';
是 out-of-bounds 访问。