记录在linux下开发遇到的各种问题,方便以后查找。
1.关于shell中脚本的执行方式:在当前脚本执行还是启动一个新的shell进程来执行脚本。
假设当前目录下有脚本script.sh。
启动一个新的shell进程来执行:
这是shell中默认的执行方式是启动一个新的shell进程(子进程)来执行脚本,即sh script.sh或者赋予script.sh执行权限后直接执行脚本:./script.sh。
在当前shell执行:
有时需要在当前shell执行脚本,比如脚本中涉及到修改shell的环境变量时,需要这样执行(否则修改的将是新启动的子shell进程的环境变量):
source script.sh或者 . script.sh(注意点 . 后面有空格,然后才是脚本路径)。
2.修改shell的环境变量。
见:http://blog.csdn.net/cnctloveyu/archive/2009/12/25/5075128.aspx
3.添加用户为sudoer:
推荐以root用户使用visudo命令(有的版本提供的是sudoedit),添加一行:
xxxx ALL=(ALL) ALL
其中,xxxx为要添加的用户名,保存就OK了
另外,也可以采用以root用户编辑/etc/sudoers,也是添加xxxx ALL=(ALL) ALL,但注意该文件默认为只读。
4.vi的常用操作
见http://blog.csdn.net/lazyclough/archive/2009/11/15/4811862.aspx
5.bash中常用快捷键
见:http://blog.csdn.net/cnctloveyu/archive/2009/12/25/5076017.aspx
6.编译别人写好的代码出现某些函数找不到时(尤其是条件编译的部分),首先考虑从配置文件上寻求解决办法,尽量不要去修改源代码。
2009-12-30
7.vim的相关:
1)安装配置vim,已经记录
2)vim的2个小技巧:
在vim中插入一个文件的内容:
:r filename
vim的ctrl-w的用法:先按住ctrl和w,然后松开,然后按其他键。
2010-01-05
8.关闭Fedora 的SELinux的方法:
修改/etc/selinux/config文件中的SELINUX="" 为 disabled ,然后重启。
如果不想重启系统,使用命令setenforce 0
详见:http://blog.csdn.net/cnctloveyu/archive/2010/01/05/5135025.aspx
9.Broadcom的板子上使用CFE作为bootloader的帮助使用:
如要查询ifconfig的帮助:
help ifconfig
附:常用的ifconfig使用:
ifconfig eth0 –auto(自动配置,需要网关有dhcp)
或者 ifconfig eth0 –addr=x.x.x.x –mask=x..x..x..x(addr为ip,mask为掩码)
10.查看网络、端口:
netstat命令:如可以使用netstat –al查看所有的socket
详见:http://blog.csdn.net/cnctloveyu/archive/2010/01/05/5135196.aspx
2010-01-06
11.shell中给变量赋值,切记在“=”的两端均不能有空格,否则shell会认为没有赋值。
2010-01-07
12.某SDK中的一段关于手动内存对齐的源码:
#define ALIGN_4096 (4096 - 1)
uint8_t *p=malloc(bufSize + ALIGN_4096);
p=(uint8_t *)(((unsigned long)p + ALIGN_4096) & ~ALIGN_4096);
假定机器是字节寻址,uint_t为8位的无符号整数的话,上面的3条语句将会使指针p的内存地址按4k字节对齐。
上述语句的效果:
如果p% 4096=0,p不变;
如果p% 4096<>0,p=(p/4096 + 1)*4096;(等式中的/是整数除法,结果取整)。
P.S.:上面的第二条语句保证了每次分配的空间都不小于4k,也就不会有2个不同的地址被对齐到相同的地址了。
2010-01-21
13.linux中网络同步时间:
ntpdate x.x.x.x
x.x.x.x是ntp时间服务器的地址,如
210.72.145.44(中国国家授时中心服务器IP地址)
s2h.time.edu.cn 四川大学网络管理中心
203.117.180.36
ntp.sjtu.edu.cn(上海交通大学网络中心NTP服务器地址)
14.段错误小结:
常见的段错误:指针访问越界;pthread线程库相关。首先考虑指针访问越界,确定指针访问没有任何问题之后再考虑其他。
这里主要说说指针访问越界:
1. 数组访问越界;
2. 使用未正确初始化的指针;
3. 试图使用已经回收的资源,如使用libcurl库时,已经使用global_clean等回收了资源,还试图访问资源(比如多线程情况下,先clean再结束还在使用libcurl资源的线程……发生段错误!)
15.共享变量(或者全局变量)的初始化:
对于多个函数或者线程共享的变量,需要确保在每次需要对该变量做初始化时使用相同初始值,对于变量的可能取值已经确定并且有限的情况,最好使用enum或者一组常量来表示该变量的可能取值,并且用一个函数来对该变量进行初始化,确保每次初始化动作相同。(对于有多个需要共享的变量或者多次需要初始化时尤为重要,可以防止错误的初始化带来的错误。)
16.使用pthread线程库的小问题:
1.认真谨慎地考虑线程间的同步问题;
2.如果需要在线程阻塞时取消线程,需要设置线程的取消属性为异步:
使用pthread_setcanceltype函数
4. pthread的线程结束函数:pthread_cancel只是给线程发送结束的信号,具体的动作由收到该信号的线程设置来定。注意使用之前先判断线程的PID是否合法。
17.C语言杂项:
1.调试程序时,可以在printf语句中使用C标准中预定义的宏:__LINE__、__FILE__,输出语句所在的行号和文件
2.宏定义中如果包含多条语句应该使用do-while循环包裹语句:
do{ }while(0);
以防止宏的副作用。
18.2个用到的库:
libcurl:一个强大的HTTP操作库,减少自己使用socket的麻烦,主页:
http://curl.haxx.se/
libmad:一个开源的高精度 MPEG 音频解码库:
使用方法:
http://blog.csdn.net/knight8267/archive/2009/09/03/4513830.aspx
2010-01-26
19.关于C、C++中的const的一点小实验:
http://blog.csdn.net/cnctloveyu/archive/2010/01/26/5258700.aspx