Program received signal SIGSEGV, Segmentation fault,求帮助~
void *sock_read(int client)
{
······
}
static void sock_accept(int server_socket,short event,void *arg)//char **argv
{
printf("start sock_accept\n");
struct event *ev=arg;
int new_server_socket;
////////////////////////////////////////
/////////////////////////////////
printf("start accept\n");
while(1) //服务器端要一直运行,
{
////////////////////////////////
/////////////////////////////////
struct sockaddr addr;
socklen_t len=sizeof(addr);
//由于此结构要长期使用,所以rev必须动态分配,否则离开此函数后会自动释放,导致segment fault
struct event *rev=(struct event *)malloc(sizeof(struct event));//*rev
new_server_socket=accept(server_socket,&addr,&len);
if(new_server_socket==-1)
{
fprintf(stderr,"Sock Accept Failed!\n");
return;
}
fprintf(stdout,"accept socket:%d\n",new_server_socket);
////////////////////////////////
///////////////////////////////
pthread_t child_thread;
pthread_mutex_init(&mutex,NULL);//初始化
printf("start talk to sock_read\n");
if((pthread_create(&child_thread,NULL,sock_read(new_server_socket),NULL))<0)//* talk_to_client
pthread_mutex_lock(&mutex);
sleep(5);
if(child_thread!=0)
{
printf("pthread_join\n");
pthread_join(child_thread,NULL);
pthread_mutex_unlock(&mutex);
printf("线程已经结束\n");
}
//创建一个读事件,当有客户连接时,接收通知。
event_set(rev,new_server_socket,EV_READ,(void *)sock_read,rev);
event_add(rev,NULL);
event_add(ev,NULL);
printf("end sock_accept\n");
free(rev);
////////////////////////////
////////////////////////////
/* 关闭 socket */
close(new_server_socket);
}
}
int main ()//int argc, char **argv
{
struct event ev; //= arg
int server_socket;
struct sockaddr_in addr;
server_socket=socket(AF_INET,SOCK_STREAM,0);
if (server_socket==-1)
{
perror("socket error\n");
exit(-1);
}
bzero(&addr,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr=htonl(INADDR_ANY); //INADDR_ANY;IPADDR
/*创建监听的socket*/
if((bind(server_socket,(struct sockaddr*)&addr,sizeof(addr)))==-1)
{
perror("bind error\n");
exit(-1);
}
if ((listen(server_socket,128))==-1)
{
perror("listen error\n");
exit(-1);
}
/*初始化libevent*/
struct event_base * base=event_init();
/*创建一个读事件,当有客户连接时,接收通知。*/
event_set(&ev,server_socket,EV_READ,sock_accept,&ev);//sock_accept
event_add(&ev,NULL);
printf("start dispatch\n");
event_dispatch();//开始事件循环
printf("end dispatch\n");
return (0);
}程序运行结束 在打印出“pthread_join”之后显示 段错误;//位置已经在程序里红色描出,前边的程序运行结果显示部分是正常的,最后就出现段错误了···
用gdb调试,显示:
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/12sslstest1...done.
(gdb) run
······//这里是程序运行的结果,比较多不写了
pthread_join
[New Thread 0xb7fdfb70 (LWP 11046)]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7fdfb70 (LWP 11046)]
0x00000000 in ?? ()
(gdb) where
#0 0x00000000 in ?? ()
#1 0x0039b96e in start_thread () from /lib/tls/i686/cmov/libpthread.so.0
#2 0x0047ca4e in clone () from /lib/tls/i686/cmov/libc.so.6
(gdb) list
645 ////////////////////////////
646 /* 关闭 socket */
647 // close(new_server_socket);
648
649 }
650 }
651
652
653 int main ()//int argc, char **argv
654 {
知道是越界,但是实在看不出是什么地方越界了,求大侠指点
...全文



