前沿:一直以来就有一种想法,就是定义一个结构体,其中只有两个指针,一个事next,另一个也是个指针,指向一个不固定大小的空间,这个空间是malloc来分配的。。。这样的话就可以摆脱了这样一种限制---->(结构体中的信息实体是用一个数组来实现,但是经常为为这个数组定义的时候下标是多大而发愁。)结构体如下:
#include
#include
#include
#include
#include
#include
#include
#define DEBUG
#ifdef DEBUG
#define DBG(x...) printf(x)
#else
#define DBG(x...)
#endif
#define flag_p 1
typedef struct kbuff_list
{
#if 1
char *Pmalloc_buff;
#else
char buff_node[20];
#endif
int flag;
struct kbuff_list *next;
}KBUFF;
KBUFF *pread_kbuff,*pirq__kbuff;
unsigned long list_cnt;
sem_t sem;
void readThread(){
KBUFF *p1;
char *p_malloc_buff;
while(1){
sem_wait(&sem);
if(pread_kbuff !=NULL){
p1=pread_kbuff;
#if 1
p_malloc_buff=p1->Pmalloc_buff;
DBG("the pread_kbuff->Pmalloc is %s,flag is %d\n",pread_kbuff->Pmalloc_buff,pread_kbuff->flag);
pread_kbuff=pread_kbuff->next;
free(p_malloc_buff);
free(p1);
#else
DBG("the pread_kbuff->buff_node is %s,flag is %d\n",pread_kbuff->buff_node,pread_kbuff->flag);
pread_kbuff=pread_kbuff->next;
free(p1);
#endif
}
}
pthread_exit(NULL);
}
KBUFF init_kbuff_list(){
list_cnt=0;
pread_kbuff=pirq__kbuff=NULL;
sem_init(&sem,0,0);
}
void main()
{
int ret;
KBUFF *p1,*p2;
char kbuffer[20]="zhangfei is best";
pthread_t id1;
int USER_SIZE;
int i=0;
init_kbuff_list();
ret = pthread_create(&id1, NULL, (void*)readThread, NULL);
if(ret!=0){
perror("Thread join failed");
exit(EXIT_FAILURE);
}
list_cnt++;
while(1){
p2=p1=(KBUFF *)malloc(sizeof(KBUFF));
//DBG("the malloc KBUFF is %d\n",sizeof(KBUFF));
USER_SIZE=15;
#if 1
p1->Pmalloc_buff=(char *)malloc(USER_SIZE*sizeof(char));
memcpy(p1->Pmalloc_buff,kbuffer,USER_SIZE);
#else
memcpy(p1->buff_node,kbuffer,USER_SIZE);
#endif
p1->flag=list_cnt;
if(list_cnt==1 || pread_kbuff == NULL){
pirq__kbuff=pread_kbuff=p1;
printf("the code get %ldth here\n",list_cnt);
}
else
pirq__kbuff->next=p1;
p1->next=NULL;
pirq__kbuff=p1;
sem_post(&sem);
list_cnt++;
if(list_cnt==65536)
list_cnt=2;
DBG("this is the %s-> %d.the flag is %ld\n",__FUNCTION__,__LINE__,list_cnt);
i++;
if(i == 10) i=0;
usleep(1);
}
}
解析:
1.对于上面这个结构体:这个结构体中的那个flag是没有实际用处的,就是调试方便。。。
这个*next不用说了,来连接链表用的。。。
而这个Pmalloc_buff是用来指向那个不确定大小信息的。
就行在main中的while(1)中的那样:
p2=p1=(KBUFF *)malloc(sizeof(KBUFF));这是先对这个结构体分配堆空间,然后
p1->Pmalloc_buff=(char *)malloc(USER_SIZE*sizeof(char));是对这个结构体中的那个指针指向的不确定大小空间分配空间(这个不确定性就是这里面的USER_SIZE来表示的)。。。
2.如何把那个#if 1编程#if 0,这个时候是是用数组来分配空间,这个时候分配的就是固定的了(因为数组定义的时候已经固定了)
3.编译的时候用这个:gcc -o net_proj net_proj.c -lpthread,因为其中创建了线程,并且,可能这个#include你找不到,我用的是ubuntu系统,这个时候就查找你的/usr/src/linux(kernel)/include下是不是有semaphore.h,这个我就不多说了,是linux的基本问题了。
4.经过反复验证,这种方法是可行的,开始一直有一个错误:free(): invalid next size (fast): 0x093df0c8,是因为这个malloc有问题(因为先前用的是p1->Pmalloc_buff=(char *)malloc(sizeof(USER_SIZE));这是不对的,要记住)。