2013-02-26 45 views
0

我是一名大学生,作为网络任务的一部分,我需要执行Stop-and-Wait协议。问题陈述需要使用2个线程。我是线程的新手,但在阅读pthreads API的手册页后,我编写了基本代码。但是,在线程创建成功后(执行传递给pthread_create()的函数的第一行作为参数)后,我得到了分段错误)。在Stop-and-Wait协议实现中使用pthreads时的SIGSEGV

typedef struct packet_generator_args 
{ 
    int max_pkts; 
    int pkt_len; 
    int pkt_gen_rate; 
} pktgen_args; 

/* generates and buffers packets at a mean rate given by the 
pkt_gen_rate field of its argument; runs in a separate thread */ 
void *generate_packets(void *arg) 
{ 
    pktgen_args *opts = (pktgen_args *)arg; // error occurs here 
    buffer = (char **)calloc((size_t)opts->max_pkts, sizeof(char *)); 
    if (buffer == NULL) 
     handle_error("Calloc Error"); 
    //front = back = buffer; 
    ........ 

    return 0; 
} 

主线程从此bufffer读取数据包并运行stop-and等待算法。

pktgen_args thread_args; 
thread_args.pkt_len = DEF_PKT_LEN; 
thread_args.pkt_gen_rate = DEF_PKT_GEN_RATE; 
thread_args.max_pkts = DEF_MAX_PKTS; 

/* initialize sockets and other data structures */ 
..... 
pthread_t packet_generator; 
pktgen_args *thread_args1 = (pktgen_args *)malloc(sizeof(pktgen_args)); 
memcpy((void *)thread_args1, (void *)&thread_args, sizeof(pktgen_args)); 
retval = pthread_create(&packet_generator, NULL, &generate_packets, (void *)thread_args1); 
if (retval != 0) 
    handle_error_th(retval, "Thread Creation Error"); 
..... 
/* send a fixed no of packets to the receiver wating for ack for each. If 
the ack is not received till timeout occurs resend the pkt */ 
..... 

我曾尝试使用gdb调试,但我无法理解为什么一个分段错误在我的generate_packets()功能的第一行存在的。希望你们中的一个能够提供帮助。如果任何人需要额外的上下文,整个代码可以在http://pastebin.com/Z3QtEJpQ获得。我在这里花了几个小时在这里真正的果酱。任何帮助将不胜感激。

回答

2

您初始化bufferNULL

char **buffer = NULL; 

,然后在main()没有进一步做,你试图解决这个问题:

while (!buffer[pkts_ackd]); /* wait as long as the next pkt has not 

基本上我半教育的猜测是,你的线程不是招目前还没有生成任何数据包,并且在尝试访问NULL中的元素时发生崩溃。

[162][04:34:17] [email protected] (~/tests) > cc -ggdb -o pthr pthr.c 2> /dev/null 
[163][04:34:29] [email protected] (~/tests) > gdb pthr 
GNU gdb 6.3.50-20050815 (Apple version gdb-1824) (Thu Nov 15 10:42:43 UTC 2012) 
Copyright 2004 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries .. done 

(gdb) run 
Starting program: /Users/vlazarenko/tests/pthr 
Reading symbols for shared libraries +............................. done 

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000 
0x000000010000150d in main (argc=1, argv=0x7fff5fbffb10) at pthr.c:205 
205   while (!buffer[pkts_ackd]); /* wait as long as the next pkt has not 
(gdb) 
+0

主要的教训是,原始的海报应该学会使用'gdb'并用'gcc -Wall -g'编译 – 2013-02-26 06:51:24