培训部分
静态库.
以lib开头,a为文件后缀
先用gcc生成.o文件
ar -r libxxx.a xxx.o xxx1.o ...
gcc main.c xxx.a
动态库
gcc -shared xxx.c -olibmuku.so
gcc main.c -lmuku -L.
如果动态库和静态库名字一样放一起,会优先调用动态
c语言错误处理
全局变量error
perror();
printf("%m");
全局变量extern char ** environ;
相关函数
getenv(),putenv().....
unix内存管理
c语言部分 malloc(),free();
系统调用 sbrk(),brk();
系统调用 mmap(),munmap()
底层 kmalloc();
unic采用虚拟内存管理,每个进程分配4g .0-3g用户空间,3-4g系统空间
代码区,只读常量区,全局区,bbs段(未初始化数据段),堆,栈依次排列
全局变量如果没有赋值就会在bbs段
栈从3g向0开辟,堆从bbs段之后向3g开辟
内存映射以页为最小单位,4K
malloc一次至少会分配一页,有些系统会多分配33页.33这个数字..天知道怎么来的.
malloc负责开辟虚拟地址,不一定会映射
free负责回收,不一定立刻回收.free不回收最后33页
void *sbrk()一般用来分配内存,sbrk(x)指针移动x,可正可负
int brk()一般用来释放内存,brk(void* x)指针移动到x位置
都是维持着一个文件指针,sbrk(0)返回当前位置
mmap(),munmap()做内存映射,以一页为单位
貌似没什么用,又麻烦,忽略
内存对应的目录/proc/PID/
/dev/tty 键盘,显示器
/dev/null 空设备,清空
文件操作的系统调用
open(0,read(),write().close()
c语言有时比系统调用快主要是用了一个全局变量作为缓存
每个进程打开一个文件就会生成一个文件表,内容是文件描述符,文件偏移量,v节点位置
lseek(int fd,off_t offset,int whence)
文件描述符,偏移量,起点
起点:
SEEK_SET 0 从头
SEEK_CUR 1从当前位置
SEEK_END 2从文件尾开始,文件尾是指文件EOF之后一个位置
dup(int fd),dup2(int newfd,int oldfd)复制文件描述符,一个整数
文件操作函数fcntl() <fcntl.h>
用法略
文件锁结构
struct flock{short l_type;//锁的类型
short l_whence;//锁定的起点参照
off_t l_start;//锁定的起点偏移量
off_t l_len;//锁定区域的长度
pid_t l_pid;//锁定进程的ID,只有F_GETLK使用,F_SETLK给 -1就可以
};
文件锁的作用只是给文件一个无关紧要状态,没有强制力
自学部分
迭代器
iter_swap()交换两个迭代器的内容
rbegin()指向end()-1;
rend()指向begin()-1;
操作按照逆向操作
流迭代器
ostream_iterator<T>(ostream)
ostream_iterator<T>(ostream,delim) delim是分隔符,const char*类型
struct random_access_iterator_tag
继承
struct bidirectional_iterator_tag
继承
struct forward_iterator_tag
继承
struct input_iterator_tag
继承
struct output_iterator_tag
仿函数
执行速度上,仿函数通常比函数指针更快
仿函数拥有内部状态
generate(coll.begin(),coll.end(),IntSequence(42));
仿函数是传值,不是传引用
除非显式用引用传参
IntSequence seq(1)
generate_n<back_insert_iterator<list<int> > ,int, IntSequence& >( back_inserter(coll),4,seq);
自修p300
MeanValue mv=for_each(coll.begin(),coll.end().MeanValue());
cout<<mv.value<<endl;
p305
预定义仿函数
头文件 functional
算数计算,比较,逻辑3运算
配接器
find_if(coll.begin(),coll.end(),bind2nd(greater<int>(),42));
p306印错了!
表达式 效果
bind1st(op,value) op(value,param)
bind2nd(op,value) op(param,value)
not1(op) !op(param)
not2(op) !op(param1,param2);
bind1st(f,x)=>F(param)=f(x,param);
bind2nd(f,x)=>F(param)=f(param,x);
针对成员函数的配接器
mem_fun_ref(op) 调用op,那是某对象的一个const成员函数
mem_fun(op) 调用op,那是某对象指针的一个const成员函数
for_each(coll.begin(),coll.end(),&Person::print);
针对一般函数的配接器
prt_fun(op)
find_if(coll.begin(),coll.end(),bind2nd(ptr_fun(strcmp),""));
自定义配接器
p310
template<class T1,class T2>
struct xxx:pjublic std::binary_function<T1,T2,T1>
{
T1 operator() (T1 base,T2 exp) const{....}
};
组合型仿函数
transform(coll.begin(),coll.end(),
ostream_iterator<int>(cout," "),
compose_f_gx(bind2nd(multiplies<int>(),5),
bind2nd(plus<int>(),10))
);
param => x= plus<int>(param,10)
=>multiplies<int>(x,5)=>cout;