0

伙计们!

我正在 *nix 下的 c 上开发多线程服务器。在进程的主线程中,我有等待连接(接受)的侦听套接字。当它获得连接时(接受返回客户端套接字描述符),我使用一些例程启动新的 pthread,该例程响应请求并关闭客户端套接字描述符。它看起来像这样:

while(1)
{
    sock_cl =(int *)malloc(sizeof(int));
    *sock_cl = accept(sock_serv, NULL, NULL);
    pthread_create(thread, attr, answer, sock_cl);
}

回答功能:

void *answer(void *arg)
{
    int sock_cl;
    char *buf;
    ssize_t r;
    lsres_t *ans;
    char *path;
    char status[STATUS_SIZE];

    sock_cl = *((int *)arg);
    if((buf = (char *)malloc(BUF_SIZE + 1)) == NULL)
    {
        sprintf(status, "%i\n", -1);
        send_data(sock_cl, status, STATUS_SIZE);
        close(sock_cl);
        free(arg);
        return NULL;
    }
    memset(buf, '\0', BUF_SIZE + 1);

    if((r = recv(sock_cl, buf, BUF_SIZE, 0)) <= 0)
    {
        close(sock_cl);
        free(arg);
        return NULL;
    }

    path = strtok(buf, "\r\0");
    if((ans = lscreate()) == NULL)
    {
        sprintf(status, "%i\n", -1);
        send_data(sock_cl, status, STATUS_SIZE);
    }
    else
    {
        if(myls(path, ans) != 0)
        {
            sprintf(status, "%i\n", -1);
            send_data(sock_cl, status, STATUS_SIZE);
        }
        else
        {
            sprintf(status, "%i\n", ans->status);
            send_data(sock_cl, status, STATUS_SIZE);
            send_data(sock_cl, ans->buf, ans->written_size);
        }
        lsdestroy(ans);
    }

    close(sock_cl);
    free(arg);
    return NULL;
}

在应答功能中,我调用 recv 从客户端接收数据并发送一些应答。它在 Linux 系统(Arch、Debian、Ubuntu)下运行良好,但是当我尝试在 Unix(Solaris)下运行它时,我在 recv 函数中得到了分段下降。问题不在缓冲区中,因为如果我尝试在与答案函数相同的线程中调用答案函数,我没有分段下降。因此,将套接字与 pthread 一起使用存在一些问题。

请告诉我如何在多线程服务器中使用套接字的任何解决方案。感谢未来的答案!

4

3 回答 3

1

在 Solaris 上,您通常需要编译-mt才能正确编译和链接多线程程序。如果你不使用它,你会像你看到的那样在线程中随机崩溃。

于 2013-05-12T21:02:34.377 回答
0

我认为在 unix recv 函数中失败并且分段错误是由于代码段free(args);

于 2013-05-12T14:47:22.670 回答
-1

可能这就是原因

   close(sock_cl);
    free(arg);
    return NULL;

这个 sock_cl 在线程之间共享,并且因为应答函数没有同步,并且因为你正在释放这个指针,其他线程必然会崩溃,如果可能的话,你可以通过在 valgrind 中运行来检查同一个程序是否损坏。

于 2013-05-12T14:52:34.330 回答