c - 创建 pthread 时出现段错误

标签 c multithreading sockets segmentation-fault pthreads

我在使用线程处理每个新连接的网络程序中遇到段错误问题。

MAX_PEERS 上面定义为 10。

...
int iret[MAX_PEERS];
pthread_t thread[MAX_PEERS];


(void) signal(SIGCHLD, reaper);
printf("before while\n");
int i = 0;
while(1) {
    if(i>MAX_PEERS-1){break;}
    client_len = sizeof(client);
    new_sd = accept(sd, (struct sockaddr *)&client, &client_len);
    if(new_sd < 0){
    fprintf(stderr, "Can't accept client \n");
    exit(1);
  }
    printf("before thread\n");
    iret[i] = pthread_create(&thread[i], NULL, connection, (void*) new_sd);
    if(iret != 0){
        printf("thread[%d] not generated!\n", i);
    }
    i++;
    printf("end of while\n");
}
....

“连接”函数开始如下

void *connection(void *sdd)
{
    int sd =* (int *) sdd; 
...

当客户端尝试连接到服务器时,我遇到段错误。

> ./server 20011                  
before while
before accept
after accept
before thread
./server: zsh: segmentation fault  ./server 20011
>

它在客户端连接之前打印“before Accept”,在客户端连接之后打印其余部分。

我是否正确创建了线程?有什么想法吗?

谢谢

最佳答案

accept() 返回一个整数,因此 new_sd 必须是一个整数。当您创建一个新线程时,您将 new_sd 转换为 void 指针。但是,当您在函数中获取该指针时,您不会将其转换回 int,而是将其转换为指向 int 的指针并取消引用它,这会导致 seg 错误。

不要使用可能不正确的转换,而是传递一个整数。假设 new_sd 将超出范围,为整数分配空间并将其传递给您的线程。

int* new_sdp = malloc( sizeof( *new_sdp )) ;
*new_sdp = new_sd ;

iret[i] = pthread_create(&thread[i], NULL, connection, new_sdp);

并在线程中:

void *connection(void *sdd)
{
    int sd = *(int *)sdd; 

关于c - 创建 pthread 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26876743/

相关文章:

iPhone UDP广播和响应

python - TCP 服务器从客户端接收数据有时不工作

c - char* 和 const char* 的区别?

c++ - 如何在运行时查看 C 程序的内存布局?

c - C11 中是否有一种机制来确保否定整数常量的预期类型?

java - Android SDK - 在后台运行功能

objective-c - 从不同的线程访问属性

c - 如果启用环回,为什么发件人没有收到其多播 UDP 数据包?

C 双向链表插入

创建和销毁线程