首页 文章

分段错误创建pthread

提问于
浏览
0

我使用线程来处理每个新连接的网络程序存在分段故障问题 .

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”,在客户端连接之后打印其余部分 .

我是否正确创建了线程?有任何想法吗?

谢谢,

1 回答

  • 0

    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;
    

相关问题