1. IAR程序下载后,一切正常,但无法启动。 --- 全局变量过大。
类似的问题再次遇到,在Linux环境下,对于一个全局变量的值进行显示,不过总会显示不全或者起始内容与逻辑不一致,后来发现是全局空间满,删除部分全局变量后,此问题消失。
2.C语言:
关于连续使用大于号/小于号的问题
请看下面一段代码:
int main()
{
int a = 0x35;
intres ;
res= (0 > a < 0x39);
printf("res:%d\n",res);
return0;
}
编译过程中,提示:“warning C4804: '<' : unsafe use of type 'bool' in operation”
在Windows XP VC6.0 编译后,结果是:res:1
在Fedora8 GCC 编译后,结果是:res:1
就是说,对于连续的大小符号进行判断,一般而言编译器是从左到右进行运算。先是进行 0>a 的判断,得到结果是1,然后是 1<0x39 的判断,结果为 1。
因此,如果要判断a是否在10-99之间,这样的语句if(99 > a > 10)这样很危险,不一定能达到预期的效果。需要写成:if(99 > a && a > 10)。
3.系统级别:
系统在某个信号出现时,按照下列三种方式中的一种进行操作。
(1) 忽略此信号。大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略。
它们是:S I G K I L L和S I G S T O P。这两种信号不能被忽略的原因是:它们向超级用户提供一种使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(例如非法存储访问或除以0) ,则进程的行为是未定义的。
(2) 捕捉信号。为了做到这一点要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件进行的处理。例如,若编写一个命令解释器,当用户用
键盘产生中断信号时,很可能希望返回到程序的主循环,终止系统正在为该用户执行的命令。如果捕捉到S I G C H L D信号,则表示子进程已经终止,所以此信号的捕捉函数可以调用 w a i t p i d以取得该子进程的进程I D以及它的终止状态。又例如,如果进程创建了临时文件,那么可能要为S I G T E R M信号编写一个信号捕捉函数以清除临时文件(k i l l命令传送的系统默认信号是终止信号) 。
(3) 执行系统默认动作。注意,对大多数信号的系统默认动作是终止该进程。
4.关于通讯
有次在使用socket进行TCP通讯的时候,Linux平台,客户端和服务器已经连接好,收发过程中,服务器突然断开,但客户端继续使用原有的socket进行通讯,接收数据,但马上产生异常,机器挂机。原因是socket被破坏了,继续使用已经损坏的socket会导致崩溃,因此在每次使用socket的时候,都检查是否有异常,连通性有没有问题,如果有异常就退出来不再使用。
5. 关于程序莫名其妙地死掉
这两天在玩Linux的QPBOC应用程序,发现程序在某个看起来完全没问题的语句死掉,死掉的地方都比较固定,但那个语句很正常。
大约排查了一个小时,发现:居然是传入的数据类型不对!我擦~~
之前也有差不多的现象,莫名其妙在某个非常 正常的语句附近死掉,后来发现是应用程序和库文件声明的结构体的元素不一致。
以后出现莫名其妙地挂死,一般考虑参数,类型这些~~