life's a struggle.
2015-08-05
2015-08-05
限制
只能在具有亲缘关系的进程间使用
历史上,都是半双工的
要点
- 对管道写,不大于PIPE_BUF(
/usr/include/linux/limits.h
=> 4K)时,可以保证不会与其他进程的写操作穿插(原子写)
与普通文件差异
管道的缓冲区固定大小(4K),不会像文件一样无限增长
- 当管道满时,调用write会被阻塞
- 当管道空时,调用read也会被阻塞
管道读是一次性的,一旦被读,就被丢弃
实现原理
在Linux中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。
通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的。
图中有两个 file 数据结构,但它们定义文件操作例程地址是不同的.
其中一个是向管道中写入数据的例程地址,而另一个是从管道中读出数据的例程地址。
这样,用户程序的系统调用仍然是通常的文件操作,而内核却利用这种抽象机制实现了管道这一特殊操作。
参考
2015-08-04
etc
自定义初始化设置
~/.gdbinit
载入配置文件
source ~/.gdbinit
启动
通过文件名
gdb <program>
使用core调试
gdb -c <core-file-name> <program>
attach到指定进程
gdb -p <pid> gdb attach <pid>
多线程调试
查看当前所有线程
info threads
查看所有线程调用栈
thread apply all bt
调试指定线程
thread <thread-num>
锁定线程(阻止线程切换)
set scheduler-locking on
控制类
运行到指定行
until $line-number
断点
在指定文件指定行
break filename:linenum
删除断点
clear linenum
栈切换
根据编号切换
frame n
向上
up <num>
查询类
打印调用栈
bt where
打印当前帧(查询当前执行语句位置)
frame
打印当前行
list *$pc
x(examine)
x /[nfu] ADDRESS(若ADDRESS是一个变量,则认为变量值为要查看的地址)
n用来指定重复的次数,就是指定显示格式和size确定的一个单位多少次
#n默认为1f用来指定显示的格式,同print一样
Format letters o(octal), x(hex), d(decimal), u(unsigned decimal), t(binary), f(float), a(address), i(instruction), c(char) and s(string)
u(unit),指定一个单位的长度
Size letters b(byte), h(halfword, 2B), w(word, 4B), g(giant, 8 bytes)
x/3uh 0x54320
从0x54320开始,以(h)2B为单位,(u)无符号十进制输出,显示3uh个这样的单 位,总共显示2 × 3 = 6B的内存
x /10s *argv 查看环境变量
set
set args ARG-list
设置程序的命令行参数,依次传给argv[1],…
#需要在文件载入之后,程序开始执行之前set print pretty
可爱的打印出结构体
set print elements 0
完全打印元素,不管有多少(查看该选项值,
show print elements
)
gdb打印STLhttps://sourceware.org/gdb/wiki/STLSupport
宏
- 查看宏定义以及位置
info macro <macro>
展开宏
macro expand <macro>
2015-07-29
2015-07-28
撤单回退资金,双重校验(传入的UID, 订单关联的UID)
增量拉取
确定前端排序规则(排序键)
传入(排序键值, 拉取个数)
错误处理
- 请求参数严格校验(防止执行时导致内部错误)
- SQL错误结合接口意义,返回客户端错误提示
保持app原版本兼容时,相关数据表,追加版本号
2015-07-27
秒级别
time()
微秒
gettimeofday()
纳秒
clock_gettime()
2015-07-24
1 | datetime.date.today() + datetime.timedelta(days=1) |
参考
2015-07-24
选项
–git-dir 指定
.git
目录–work-dir 指定工作目录
常用命令
丢弃未缓存的修改
git checkout -- order.cpp
默认推送所有分支和tag
git push --all origin -u
迁出到指定目录
git --work-tree=../v0.03 checkout v0.03 .
2015-07-23
nohub
nohup ping www.google.com &
2015-07-23
不能转换空字符串!(需要捕获异常)
try { boost::lexical_cast<int>(""); } catch (boost::bad_lexical_cast &e) { ; }