一、在多线程中,如果有全局变量和函数中的局部变量同名,则如果所在线程不退出,则局部变量一直有效,导致全局变量不可用;
二、守护进程daemon不能用gdb调试,但可以使用syslog服务,将出错信息写入指定文件;
三、管道文件不属于任何文件系统,而且只存在于内存中,但FIFO在文件系统中可见;
四、kill()向外发送信号,raise()不仅可以向外发送,还可以向自己发送信号;
五、信号处理函数sigaction比signal好;
六、线程退出用pthread_exit,而不能用exit,否则整个进程下线程全部被关闭;pthread_cancel用于一个线程关闭另一个线程;
七、PV原子操作(信号量)用于互斥操作时,往往只设置一个信号量sem,而用于同步操作时,则设置初始值不同的多个信号量,用来实现顺序执行;
八、关于typedef,不管何时,只要为指针声明typedef,都要在typedef中间加上const,使得指针本身是常量,而不是对象,注意区别:typedef char *p 与 typedef const char *p;
九、typedef int (*PF) (const char *, const char *)可以将int (*Register (int (*pf)(const char *, const char *)))(const char *, const char *)精简为PF Register(PF pf);
十、关于IP地址转换,一般用两种接口:inet_pton (新,支持IPV6)和inet_addr (旧,点分十进制转相关格式),推荐使用前者inet_pton;
十一、TCP是无记录边界的字节流协议,因此在传递数据时,并不是一次性完整传完,需要使用循环,让read不停的读取,直到read返回0为止或者返回负值,但UDP不同,每个UDP数据报都有一定的长度,可以认为一个数据报就是一条记录;
十二、errno是系统自带的全局变量,不需要定义,直接使用;
十三、size_t的作用是屏蔽不同平台的差异,原型为unsigned int;
十四、TCP通过给所发送数据的每一个字节关联一个序列号进行排序,如有2048个字节,TCP将其拆成2个分节(分节是TCP传递给IP层的数据单元),第一个分节的序列号为1~1024,第二个分节为1025~2048,这样就算非序到达也可以重排;
十五、TCP连接是全双工的,即同一时间既可以读也可以写;
十六、如何用char保存数字65535,只要定义char a[2],赋值a[0]=255,a[1]=255,需要显示时,只要将其强制类型转换为(int *)即可;
十七、Linux标准函数库中没有整形转字符串的函数,所以使用sprintf进行格式转换,如:
int port=9999;
char port2[20];
sprintf(port2, "%d", port1);
十八、如何将两个char放入一个int中,采用int = char1 | (int) char2 << 8即可;
十九、%p用于打印16位地址;
二十、UDP是无连接的,所以每次传输数据时,内核都会自动分配IP和端口来暂时连接套接口,事后断开,因此如果要给同一个目的地址发送大量数据报,使用connect效率会更高,因为不用连接很多次 (如果使用connect,就不能使用sendto和recvfrom了);
二十一、使用系统调用mkdir接口时,会遇到实际生成的文件夹权限与预期不符,原因是由于系统环境umask的干扰,所以需要在调用mkdir之前先调用umask(0)来消除影响;
二十二、/lib64/libc.so.6: version 'GLIBC_2.14' not found 是因为系统glibc版本太低,两种方法解决,一是升级系统glibc的版本,二是编译程序时指定glibc的版本为低版本,我选第二种,具体方法如下:
首先查看APP Glibc 兼容性.看当前app使用了哪些Glibc版本.
objdump -p libalgrms.so
[root@localhost lib]# objdump -p libalgrms.so
libalgrms.so: file format elf64-x86-64
.....
Version References:
required from libc.so.6:
0x06969194 0x00 04 GLIBC_2.14
0x0d696914 0x00 03 GLIBC_2.4
0x09691a75 0x00 02 GLIBC_2.2.5
然后查看当前app引用了GLIBC_2.14中哪些函数
nm libalgrms.so | grep GLIBC_2.14
[root@localhost lib]# nm libalgrms.so | grep GLIBC_2.14
U memcpy@@GLIBC_2.14
也可以使用 objdump 查看app动态引用符号表.
objdump -T libalgrms.so | grep GLIBC_2.14
[root@localhost lib]# objdump -T libalgrms.so | grep GLIBC_2.14
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.14 memcpy
上例显示app引用 2.14 版本中的memcpy函数.
下面将用到 gcc 的一个特性实际上是ld的特性.可以将引用符号绑定到一个特定版本.只需在.c文件中写入类似代码.
__asm__(“.symver original_foo,foo@VERS_1.1″);
即可.
查找当前系统glibc版本中memcpy的各个版本.
获取libc.so实际路径.
# gcc --print-file-name=libc.so
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so
# file /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so: ASCII text
-bash-4.1# cat /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )
-bash-4.1# file /lib64/libc.so.6
/lib64/libc.so.6: symbolic link to `libc-2.16.so'
获取memcpy版本信息.
-bash-4.1# nm /lib64/libc-2.16.so |grep memcpy
...
000000000008a6d0 i memcpy@@GLIBC_2.14
0000000000084ab0 i memcpy@GLIBC_2.2.5
...
可以看出memcpy最低版本是(“@GLIBC_2.2.5″)2.2.5,而默认使用版本是2.14(“@@GLIBC_2.14″) 这里我们只要将 glibc 2.14 版本memcpy降到glibc 2.2.5. 在源代码写入以下代码
__asm__(“.symver memcpy,memcpy@GLIBC_2.2.5″);
重新编译.
再次查看app信息.
#objdump -p app
...
Version References:
required from libc.so.6:
0x0d696913 0x00 04 GLIBC_2.3
0x0d696914 0x00 03 GLIBC_2.4
0x09691a75 0x00 02 GLIBC_2.2.5
发现当前版本需求已不再需要glibc 2.14支持.
# objdump -T app |grep memcpy
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 memcpy
memcpy已完全修改为Glibc 2.2.5支持.
二十三、
递归指定类型文件遍历其中内容的方法
grep "xxx" * -Rn 常常会把tags中的东西也抓取出来,实在很不好,文件多了简直就是眼花撩乱啊!
比如你指想查 .h 或者.c 或者.cpp中的一种 怎么办呢 grep "xxx" *.c -Rn 递归显然不行...
使用下面这种:
find . -name *.cpp | xargs -i grep "xxx" {} --color -RnH
就可以实现,当然有的人喜欢用下面这种
find . -name "*.cpp" -exec grep "xxx" --color -RnH {} \;
我们主要讲下蓝色的部分,利用xargs -i很关键 这样{} 才会起到占位符的作用,{}代表的是xargs很多参数中的一个,对他们进行迭代处理;
后面讲下参数 --color 这个没什么 就是显示颜色 ls也是这样, R表示递归 n表示显示行号 H表示显示文件名 h小写不显示文件名。
二十四、
文件夹软连接的方法:ln -s /mnt/hgfs/ /home/luo/ (解释:将hgfs文件夹链接放入到luo目录下) 注意后面的“/” 是将目录里所有的文件链接过去,必须加上,否则,建立的目录显示颜色异常,还不能正常访问,如cd 进不去
二十五、
动态增加目录大小的方法:mount -t tmpfs -o size=100M none /path(该方法是通过分出100M内存空间给目录,而不是从磁盘划分,这样做速度快,但注意内存的剩余大小,不要影响正常运行)
二十六、
简单的增加开机运行行为的方法:编辑/etc/rc.local文件,在最后加入shell脚本路径或shell命令即可
二十七、
在64位的linux上运行32位的程序
症状
(1)执行bin文件时提示:No such file or directory
(2)ldd bin文件 的输出为: not a dynamic executable
(3)file bin文件 的输出显示程序是32位
解决
debian上只要安装 ia32-libs这个包(apt-get install ia32-libs)就可以了。
$ sudo apt-get install ia32-libs
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是
因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件
包尚未被创建或是它们已被从新到(Incoming)目录移出。
下列信息可能会对解决问题有所帮助:
下列软件包有未满足的依赖关系:
ia32-libs : 依赖: ia32-libs-i386 但无法安装它
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get install ia32-libs
二十八、
生成ubuntu的文件系统
debootstrap --arch i386 trusty fs_ubuntu_trusty/
其中,trusty表示ubuntu的版本,fs_ubuntu_trusty是为了存储文件系统而生成的文件夹
二十九、
根文件系统和linux内核版本有五个方面的联系:
1、需要用相同的编译器。
2、kernel中必须配置对根文件系统类型的支持:你的kernel中必须支持yaffs
3、kernel中对flash的分区,必须和实际情况一致。
4、bootloader传给kernel的参数必须要和实际情况一致
5、bootloader中定义的机器ID必须和kernel中定义的一致
三十、
查看系统硬盘空间占用情况
du -h --max-depth=1 /
三十一、
fedora切换根用户
su - root
三十二、
ubunut有时网络不通的解决办法:
Solving the Ubuntu 12.04 Update Error: (-5 - No address associated with hostname)
Step 1: Go to System –> Preferences –> Network Connections.
Step 2: Next, select your default Network Interface (eth0) and click ‘Edit’.
Step 3: Then select ‘IPv4 Settings’ and choose ‘Automatic (DHCP) addresses only’.
Step 4: Next, enter the new DNS server addresses in the ‘DNS servers’ box. Use commas to separate multiple addresses and click ‘Apply’ to save.
Step 5: Choose your preferred DNS details
三十三、
apt包安装和卸载
安装
sudo aptitude install kchmviewer-nokde
删除
sudo aptitude remove kchmviewer-nokde
三十四、
pivot_root和chroot的主要区别是,pivot_root主要是把整个系统切换到一个新的root目录,而移除对之前root文件系统的依赖,这样你就能够umount原先的root文件系统。而chroot是针对某个进程,而系统的其它部分依旧运行于老的root目录。