a storage class can only be specified for objects and functions
extern修饰一个struct报错,错误原因如上,C++中存储类修饰符有auto、register、extern、static,这几种修饰符只能修饰对象或者函数,这里用extern来修饰struct是错误的。
g++生成动态链接库的命令
-shared表示是标准对象,-fPIC表示函数能够重定向。
g++ -o libThreadPool.so -shared -fPIC ThreadPool.cpp -l pthread
g++调用本地动态库编译命令
-L指定动态库搜索路径,如果系统默认路径找不到,就到-L指定路径搜索
g++ -o testpool testpool.cpp -l ThreadPool -L ./
g++的命令中 -g生成调试信息以后,查看core时就可以bt查看调用堆栈
查看core信息
gdb a.out
core core.xxxxx
bt
此时可以p查看各个变量的值来更精确定位错误
查看文件链接的动态库信息
ldd execfile
同步/异步
同步和异步往往和线程有关系,比如SendMsg,线程A->线程B,发送消息后需要等待其他线程或进程的响应。
如果SendMsg以后线程A等待线程B返回响应消息,线程才继续处理,这就是同步
如果SendMsg以后线程A就继续做自己的事情,而注册了一个回调或者响应线程来处理线程B的响应消息,这就是异步
同步往往是阻塞的
异步往往是非阻塞的
阻塞/非阻塞
阻塞read:线程将阻塞,直到有可读的数据。
非阻塞read:设置O_NOBLOCK以后,如果fd没有可读的数据,read将立即返回-1并设errno为EAGAIN。
在有可读数据时阻塞与非阻塞read是一样的。
阻塞write:data从user-mode空间move到kernel-mode空间,之后系统完成kernel-mode到物理缓冲的处理并返回,然后阻塞IO返回。
非阻塞write:data从user-mode空间move到kernel-mode空间,write返回。
linux信号
linux向指定进程发指定信号
kill -s signal_name/signal_no pid
signal_number sig Value
0 0
1 SIGHUP
2 SIGINT
3 SIGQUIT
6 SIGABRT
9 SIGKILL
14 SIGALRM
15 SIGTERM
64位下的long长度是64
linux下查看内存的方式
x/100x 0x46505650
undefined reference to
可能依赖库的顺序不对
gdb调试信号,避免gdb把信号接管
handle SIGINT nostop print pass
signal SIGINT
子进程如何知道父进程是否退出
1.getppid,如果等于1表示父进程已经退出
2.注册信号,父进程退出时给子进程发送信号
3.管道处理,父进程和子进程建立管道,定时收发消息,通过管道保持联络
4.父进程锁一个文件,子进程检查锁,如果不能得到锁,说明父进程还在
nohup方式启动进程 nohup processname &
以nohup方式启动,起到守护进程的作用
解决gcc乱码 LANG=en_us
gdb多进程调试
方法1:调试多进程最土的办法:attach pid
方法2: set follow-fork-mode child + main断点
方法3: set follow-fork-mode child + catch exec
最近最好玩的笑话:朋友想做一个包子,结果做成了锅盔,感慨道:包子呀,你注定做不了自己。
还有我那思路超级发散的媳妇,大家讨论说多招几个人,招够4个人就可以搓麻将了,她瞬间回了一句,招够7个多好,可以召唤龙珠了!
我是一个无趣的家伙,可我的生活很好玩,贱贱的朋友、萌哒哒的老婆、还有摄影师+大厨的朋友、还有还有......
【LINUX】编程笔记