使用线程安全的strtok_r
最近改写一个dns-flood的程序为多线程模式,发现每个线程中生成的随机数字经常是一样 。 [dns-flood](https://github.com/nickwinn/dns-flood)void nameformat(char *name, char *QS) { char *bungle, *x; char elem[128]; *QS = 0; bungle = malloc(strlen(name) + 3); strcpy(bungle, name); x = strtok(bungle, "."); while (x != NULL) { if (snprintf(elem, 128, "%c%s", strlen(x), x) == 128) { puts("String overflow."); exit(1); } strcat(QS, elem); x = strtok(NULL, "."); } free(bungle); } 该函数是在构造DNS请求报文中被调用,通过传入指针name将字符串复制到QS指向的地址内。debug发现QS经常打印出来和name不一样,查了发现strtok不是线程安全的,改用strtok_r后终于OK了。 void nameformat_r(char *name, char *QS) { char *bungle, *x; char elem[128]; char *flag; *QS = 0; bungle = malloc(strlen(name) + 3); strcpy(bungle, name); x = strtok_r(bungle, ".", &flag); while (x != NULL) { if (snprintf(elem, 128, "%c%s", strlen(x), x) == 128) { puts("String overflow."); exit(1); } strcat(QS, elem); x = strtok_r(NULL, ".", &flag); } free(bungle); }