【发布时间】: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