使用线程安全的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); }

December 28, 2016 · 1 min · pm

c使用regex库进行正则匹配

C语言其实也可以直接使用自带的regex库进行一些基础的匹配操作,其实主要就是使用regcomp,regexec, regerror和regfree.具体的用法man一下就可以了。下面是一个范例。 $ cat mygrep.c #include #include #include #include #define BUF_SIZE 8192 int main(int argc,char *argv[]) { regex_t regex; int reti; char line_buf[BUF_SIZE]; FILE *FP; long int count=0; printf("regex is: %s\n",argv[1]); reti=regcomp(®ex,argv[1],REG_EXTENDED); if(reti){ perror("complie regex expression error!\n"); } if( (FP=fopen(argv[2],"r"))==NULL){ perror("open file failed"); } while(fgets(line_buf,BUF_SIZE,FP)){ ```bash reti=regexec(®ex,line_buf,0,NULL,0); if (reti==0){ ++count; } } regfree(®ex); printf("%ld\n",count); fclose(FP); return 0; }

May 25, 2012 · 1 min · pm