在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;
}
答案 0 :(得分:1)
很可能mnunberg达到了标记并且崩溃发生在pthread_create()
而不是你认为的那条线上。
man pthread_create
:
在返回之前,成功调用 pthread_create()存储 thread 指向的缓冲区中新线程的ID;这个标识符 用于引用后续调用其他pthread的线程 功能
允许传递NULL指针作为第一个参数( thread )是毫无意义的。