与gcc链接时,Solaris和GNU / Linux之间的lpthread库差异

时间:2015-02-13 12:22:42

标签: c linux multithreading gcc solaris

在Linux(Debian 7)中,当我运行服务器时,指向阵列* arg for * doSomething的指针会因为分段错误而崩溃。 (行int *arg = malloc(sizeof(*arg));) 当我在Solaris中运行相同的代码时,它就像魅力一样运行。 一切都在各自的OS(在Solaris上运行,在Solaris上编译等)编译,没有错误或警告。 没有doSomething方法的服务器主体的代码片段

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; 
} 

1 个答案:

答案 0 :(得分:1)

很可能mnunberg达到了标记并且崩溃发生在pthread_create()而不是你认为的那条线上。

man pthread_create

  

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

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