当前位置: 技术问答>linux和unix
多线程ping程序中main线程停止执行,求大牛哥相助!
来源: 互联网 发布时间:2017-05-24
本文导语: 本程序主要实现同时测量到多个ip地址的延时值,用多线程实现。以下显示代码是程序的核心部分,但运行有问题,求高手相助! //initial 初始化 //send 发包 //recv 收包 //proc 处理包,即取包中的数据,计算延时并...
本程序主要实现同时测量到多个ip地址的延时值,用多线程实现。以下显示代码是程序的核心部分,但运行有问题,求高手相助!
//initial 初始化
//send 发包
//recv 收包
//proc 处理包,即取包中的数据,计算延时并显示
void *initialsendrecvproc( struct addrinfo *ai )
{//为方便找出问题,本函数进行了简化,去掉了循环
//只发一个ping包,然后接收该ping包的返回包
//最后计算这两个包的时间差,并输出该时间差值
//具体initial、send、recv、proc代码以下省略
…………
pthread_exit(NULL);
}
int main(int argc, char **argv)
{
int i;
struct addrinfo *ai;
char *h;
//ipaddress是一个纯文本文件,为方便找问题,文件里只包含两行字符串
//第一行是”www.google.com” 第二行是”www.kame.net”
if ((fp1 = fopen("ipaddress","r")) == NULL)
{
printf("cannot open infilen");
exit(0);
}
while(!feof(fp1))
{
fscanf(fp1,"%s",host); //host的定义语句为 char host[100]
ai = Host_serv(host, NULL, 0, 0);
h = Sock_ntop_host(ai->ai_addr, ai->ai_addrlen);
printf("PING %s (%s): %d data bytesn", ai->ai_canonname ? ai->ai_canonname : h, h, datalen);
memset(&thread, 0, sizeof(thread));
if (( pthread_create(&thread, NULL, initialsendrecvproc(ai), NULL)) != 0)
{
printf("thread %d create fail!n", i++);
}
else
{
printf("thread %d create success!n", i++);
}
sleep(1);
}
}
程序想达到的效果是启两个线程,分别测试到www.google.com和www.kame.net 的延时,但以上程序执行的结果如下:
[ root@ipv6measure hj]# gcc dxcpingipv6.c –o dxcpingipv6 –lpthread –lunp –g
[ root@ipv6measure hj]# chmod u+s dxcpingipv6
[ root@ipv6measure hj]# ./dxcpingipv6
PING www.google.com (2404:6800:4005:801::1013): 56 data bytes
64 bytes from 2404:6800:4005:801::1013: seq=0, hlim=49, rtt=287.707 ms
[ root@ipv6measure hj]#
也就是说第一个线程启动成功了。但第一个线程执行完了以后,整个程序就结束了,Main线程不再继续往下执行了(按道理第一个线程创建成功后,main线程应执行else后面的语句,显示“thread 0 create success!”才对)。难道问题出在
pthread_create(&thread, NULL, initialsendrecvproc(ai), NULL)这一行?我百思不得其解,求大牛哥帮忙!
//initial 初始化
//send 发包
//recv 收包
//proc 处理包,即取包中的数据,计算延时并显示
void *initialsendrecvproc( struct addrinfo *ai )
{//为方便找出问题,本函数进行了简化,去掉了循环
//只发一个ping包,然后接收该ping包的返回包
//最后计算这两个包的时间差,并输出该时间差值
//具体initial、send、recv、proc代码以下省略
…………
pthread_exit(NULL);
}
int main(int argc, char **argv)
{
int i;
struct addrinfo *ai;
char *h;
//ipaddress是一个纯文本文件,为方便找问题,文件里只包含两行字符串
//第一行是”www.google.com” 第二行是”www.kame.net”
if ((fp1 = fopen("ipaddress","r")) == NULL)
{
printf("cannot open infilen");
exit(0);
}
while(!feof(fp1))
{
fscanf(fp1,"%s",host); //host的定义语句为 char host[100]
ai = Host_serv(host, NULL, 0, 0);
h = Sock_ntop_host(ai->ai_addr, ai->ai_addrlen);
printf("PING %s (%s): %d data bytesn", ai->ai_canonname ? ai->ai_canonname : h, h, datalen);
memset(&thread, 0, sizeof(thread));
if (( pthread_create(&thread, NULL, initialsendrecvproc(ai), NULL)) != 0)
{
printf("thread %d create fail!n", i++);
}
else
{
printf("thread %d create success!n", i++);
}
sleep(1);
}
}
程序想达到的效果是启两个线程,分别测试到www.google.com和www.kame.net 的延时,但以上程序执行的结果如下:
[ root@ipv6measure hj]# gcc dxcpingipv6.c –o dxcpingipv6 –lpthread –lunp –g
[ root@ipv6measure hj]# chmod u+s dxcpingipv6
[ root@ipv6measure hj]# ./dxcpingipv6
PING www.google.com (2404:6800:4005:801::1013): 56 data bytes
64 bytes from 2404:6800:4005:801::1013: seq=0, hlim=49, rtt=287.707 ms
[ root@ipv6measure hj]#
也就是说第一个线程启动成功了。但第一个线程执行完了以后,整个程序就结束了,Main线程不再继续往下执行了(按道理第一个线程创建成功后,main线程应执行else后面的语句,显示“thread 0 create success!”才对)。难道问题出在
pthread_create(&thread, NULL, initialsendrecvproc(ai), NULL)这一行?我百思不得其解,求大牛哥帮忙!
|
pthread_create(&thread, NULL, initialsendrecvproc(ai), NULL)
应该是pthread_create(&thread, NULL, initialsendrecvproc, ai)吧。
你这样等于在主线程里调用了initialsendrecvproc,由于函数调用了pthread_exit造成主线程退出。
应该是pthread_create(&thread, NULL, initialsendrecvproc, ai)吧。
你这样等于在主线程里调用了initialsendrecvproc,由于函数调用了pthread_exit造成主线程退出。
|
sleep(1); 改为 sleep(100); 呢
另外,发代码时使用代码格式
另外,发代码时使用代码格式
|
sleep(1);
1000=1s
1000=1s