【问题标题】:lpthread libary difference between Solaris and GNU/Linux when linking with gcc与 gcc 链接时 Solaris 和 GNU/Linux 之间的 lpthread 库差异
【发布时间】:2015-04-14 11:48:33
【问题描述】:

在 Linux(Debian 7) 中,当我运行服务器时,指向 *doSomething 的数组 *arg 的指针会因分段错误而崩溃。 (线int *arg = malloc(sizeof(*arg));) 当我在 Solaris 中运行相同的代码时,它运行起来就像一个魅力。 一切都在各自的操作系统上编译(在 Solaris 上运行,在 Solaris 上编译等),没有错误或警告。 没有doSomething方法的服务端主体代码sn-p

int main(int argc, char *argv[])
{
     int sockfd, portno,pErr;
     socklen_t clilen;
     //char buffer[256];
     //char servPlay[10];

     struct sockaddr_in serv_addr, cli_addr;
     int n;
     if (argc < 2) {
         fprintf(stderr,"ERROR, no port provided\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        error("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
              error("ERROR on binding");
      while(1) {
        int newsockfd;
        printf("Listening\n");
        listen(sockfd,5);
        clilen = sizeof(cli_addr);
        newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr, &clilen);
        if (newsockfd < 0) 
            error("ERROR on accept");
        printf("Client %s connected\n", inet_ntoa(cli_addr.sin_addr));
        int *arg = malloc(sizeof(*arg));
        if(arg ==NULL) {
            fprintf(stderr, "No memory for thread\n");
        }
        *arg=newsockfd;
        pErr = pthread_create(NULL,NULL,doSomething,arg);
        if(pErr!=0)
        {
            error("Cannot cread thread\n");
            //break;
            }
        }
     close(sockfd);
     return 0; 
} 

【问题讨论】:

  • 即使你能指出我为 solaris 和 linux 提供 lpthread 库源的方向,我也会很感激。
  • 如果它在调用malloc 时崩溃,它应该与pthread 库无关。但是,您可能想要更改您的代码,以便在 malloc 调用失败时不使用 arg 变量(返回 NULL),如果分配失败,您现在只需打印一条错误消息,但仍会继续取消引用 (NULL) 指针。
  • 你说得对,我还没有意识到我实际上继续使用空指针。但这又引出了另一个问题,为什么我在 Solaris 中运行时可以分配内存,但在 Linux 中却不分配?
  • 这可能就像没有任何可用内存一样简单?或者没有足够大的块来映射?这个问题什么时候发生?第一次连接? X 次连接后?
  • 第一次连接时发生。

标签: c linux multithreading gcc solaris


【解决方案1】:

mnunberg 很有可能达到了目标,崩溃发生在pthread_create(),而不是你想象的那一行。

man pthread_create:

在返回之前,成功调用 pthread_create() 会存储 thread指向的缓冲区中新线程的ID;这个标识符 用于在后续调用其他 pthread 时引用该线程 功能。

允许将 NULL 指针作为第一个参数(thread)传递是没有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多