哈希表

一般的表,如果需要查找某个关键字的记录,就得从表头开始,挨个地比较记录a[i]和key的值是否相等,如果相等就算成功找到了,返回i;假如是有序表来查找,可以通过a[i]和key来二分查找,直到找到相应的i;最终为了找到那个i,其实也就是相对的下标,再通过顺序存储的存储位置来计算,也就是第一个元素内存存储位置加上i-1个单元位置LOC(ai)=LOC(a1)+(i-1)*c,得到最后内存地址

由此可[……]

Read more

再看malloc动态分配内存

一向对内存敏感性不好,或者说不太有sense,基础恶补恶补很有必要,结合刚看了下一个日本人写的关于malloc的讲解,理清下思路

malloc()是根据参数指定的尺寸来分配内存块,返回指向内存块初始位置的指针,经常用于动态分配结构体的内存领域,分配执行前还不知道大小的数据的内存区域等

p = malloc(size);
free(p);

一旦内存分配失败(内存不足?),malloc()会返回NULL[……]

Read more

移位

2年前被Boss问了个问题,好像就是变量的倍数如何写,迟疑地问:不是直接乘么?然后结果可想而知,当然当时想要我回答的答案是移位,时过境迁,突然在想,如今这么潮的编译器难道不会优化成移位么

移位<<和>>用于左移和右移,最简单的x<<2将x的值左移两位,右边空出来了两位用0来补,实际上含义就是x乘以4;对于unsigned无符号值进行右移,左边空出来的部分用0来补[……]

Read more

socket双向通信

既然能够进行数据传输,那干脆再试着进行双向数据传输,就变成了简单的命令行聊天室一样,但是需要考虑几个问题

1:socket是否是双向数据传输,幸运的是肯定的

2:如果一端既发送又接收,如何调和的问题,不可能串行一前一后吧,这样发送和接收肯定无法都实时刷新结果,最简单的就是弄两个进程或者两个线程,一个发送一个接收,这里分别通过while(1)来持续操作

下面是分别通过多进程实现,code比较简单随意[……]

Read more

socket建立连接

通过pipe,fifo等可以直接同一台机器上进行进程间通信,而通过网络相连的机器之间进行进程间通信要用到套接字接口,实际上套接字可以用在同一台机器上,也可以用在不同的机器上;也就是既可以内部通信,又可以相互之间通信

套接字是通信端点的抽象,和文件描述符一样,访问套接字也需要套接字描述符,处理文件描述符的read,write都可以处理套接字描述符

1:调用socket函数就会创建一个socket描述[……]

Read more

信息存储和字节序

计算机使用8位字节块作为最小寻址和存储单位,一个字节在二进制里值域为00000000~11111111,十进制就是0~255,而这种表示方法要么太长了,要么转换太麻烦,所以就用十六进制来描述,值域为00~FF,把A的二进制记住就行了,后面就好推算了,当然大脑比较灵活的人啥都不用记,直接心算一遍好了~!

十六进制                        十进制[......]

Read more

Socket套接字

不论是pipe还是fifo,它们在进程进程间通信时都有资源共享,基本都只能运行在同一台机器上才行,而想要一台机器上的进程和另一台机器上的进程进行数据通信,可以用到socket套接字接口,除了可以与管道相似的方法使用socket之外,套接字还包括了计算机网络中的通信,多台机器进程之间进行通信,更直白一点可以支持网络中的客户端/服务器通信,可是一台机器不同的进程可以通过进程PID来标识区分,网络中却不[……]

Read more

FIFO阻塞读写

pipe一般都要和fork结合起来用,所以多进程都是基于一个主进程产生的,有一定的关联性,假如两个毫无相关的进程要进行进程间通信,命名管道可以实现;一个进程向FIFO写数据,另一个进程从FIFO读取数据

为了保持原子操作,可以通过阻塞方式来打开FIFO,就算只有一个读进程或者只有一个写进程存在,也会阻塞住等待对应的另一个进程的出现

打开FIFO的方式有下面几种:

open(const char *p[......]

Read more

命名管道FIFO

fork出来的进程通过普通管道pipe传递数据,而这些进程他们最先都是由一个主进程给构造出来的,也就是有相关性,而如果是想在完全不想关的进程之间传输数据,Linux下可以通过一种特殊的文件来完成,命名管道,它在文件系统中是以文件名的形式存在的

命令行创建命名管道:

[lihui@localhost ~]# mkfifo one
[lihui@localhost ~]# ll one
prw-r--r[......]

Read more