gpt4 book ai didi

c - 释放 pthread_create 中指定的函数中的参数

转载 作者:行者123 更新时间:2023-12-02 07:08:16 29 4
gpt4 key购买 nike

我正在编写一个小型服务器,它创建一个新线程来处理每个新连接。我需要使用 pthread_create 的第四个参数将套接字传递给函数。当试图释放用于套接字的内存时,出现段错误。沟通工作正常。我试过传递一个 void* 和一个 void**(转换为 void*,有点难看)

这是我在尝试解决这个问题时使用的最新工具,稍后将在响应函数中进行实际工作。

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <pthread.h>

void *respond(void *thread_arg)
{
void *arg = *(void**)thread_arg;
printf("responding...\n");
int client_sock;
client_sock = (int)arg;

char *message = "Write smthng to echo!\n\t";
send(client_sock,message,strlen(message),0);
char *buf = (char*)malloc(100);
int ptr = 0;
char last = ' ';
while (last != '\n') {
recv(client_sock,&last,1,0);
buf[ptr++] = last;
}
buf[ptr++] = '\n';
send(client_sock, buf, ptr, 0);
ptr = 0;
free(buf);
close(client_sock);
//free(arg); // why segfault?
//free(*(void**)thread_arg); // the same
pthread_exit(NULL);
}

int main(int argc, char **argv)
{
int socket_desc, client_sock, addrlen, tmp;
struct sockaddr_in address;
pthread_t *responder_thread;
void *cs;

socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if (socket_desc < 0)
printf("could not create socket");
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
tmp = bind(socket_desc, (struct sockaddr *)&address, sizeof(address));
if (tmp < 0)
printf("could nod bind to port!");
listen(socket_desc, 5);

addrlen = sizeof(struct sockaddr_in);
while (true) {
client_sock = accept(socket_desc, (struct sockaddr *)&address, (socklen_t*)&addrlen);
if (client_sock < 0) {
printf("could not create client socket");
} else {
printf("Accepted connection!\n");
cs = malloc(sizeof(int));
cs = (void*)client_sock;
responder_thread = (pthread_t*)malloc(sizeof(pthread_t*));
tmp = pthread_create(responder_thread, NULL, respond, (void*)&cs);
//cs = NULL;
if (tmp) {
printf("pthread_create returned '%d', exiting", tmp);
exit(-1);
}

}
}
pthread_exit(NULL);
}

最后澄清一下;说到c,我非常缺乏经验。 :)

最佳答案

您有大量内存泄漏和一般内存错误:

cs = malloc(sizeof(int));
cs = (void*)client_sock;

第一行分配内存并将指针分配给cs,第二行立即丢弃该指针,用整数值client_sock 覆盖它。稍后您尝试释放那个值,这是一个明显的错误,因为它不是一个有效的指针。

你应该像这样构造你的代码:

int * cs = malloc(sizeof(int));
*cs = client_sock;
pthread_create(..., cs);

线程函数:

void * respond(void * thread_arg)
{
int * cs = (int*)thread_arg;
/* ... */
free(cs);
}

不需要通过获取 cs 的地址进行额外的间接访问。

关于c - 释放 pthread_create 中指定的函数中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719888/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com