双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

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

leihelin5201314 leihelin5201314 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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 {

知道是越界,但是实在看不出是什么地方越界了,求大侠指点
...全文
评论 6
收藏 已收藏
分享
返回顶部
leihelin5201314
Linux/Unix社区 23,224 成员 74,535 内容