Program received signal SIGSEGV, Segmentation fault,求帮助~

leihelin5201314 2010-12-28 01:24:20
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 {

知道是越界,但是实在看不出是什么地方越界了,求大侠指点
...全文
3380 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fyjixian 2011-12-10
  • 打赏
  • 举报
回复
咋么搞定的。我也遇到同样的问题了。
NetBar_DJ 2011-06-28
  • 打赏
  • 举报
回复
如何搞定的?我目前也遇到段错的问题,查不出原因,很纠结呀
leihelin5201314 2010-12-28
  • 打赏
  • 举报
回复
搞定了,谢了
leihelin5201314 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jihen 的回复:]

pthread_create(&child_thread,NULL,sock_read(new_server_socket),NULL)
pthread_create(&child_thread,NULL,sock_read,(void *)&new_server_socket)
[/Quote]

参数传递改好了,只是程序只能运行一次,第二次的时候只显示:
段错误 (core dumped)

程序的结果也没有,是不是这个线程没有关闭?
leihelin5201314 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jihen 的回复:]

pthread_create(&child_thread,NULL,sock_read(new_server_socket),NULL)
pthread_create(&child_thread,NULL,sock_read,(void *)&new_server_socket)
[/Quote]
编译的时候会产生警告:
12sslstest1.c: In function ‘sock_accept’:
12sslstest1.c:621: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type
/usr/include/pthread.h:227: note: expected ‘void * (*)(void *)’ but argument is of type ‘void * (*)(int)’

警告怎么去掉?

另外,在别函数调用这个new_server_socket的时候作为参数传递不过去,发数据和收数据发不出也收不到···
估计是这个new_server_socket的调用···不知道怎么解决?
jihen 2010-12-28
  • 打赏
  • 举报
回复
pthread_create(&child_thread,NULL,sock_read(new_server_socket),NULL)
pthread_create(&child_thread,NULL,sock_read,(void *)&new_server_socket)

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧