发布时间:2013-01-07 23:46:59
第一部分:宏为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。但是宏也有很多的不尽人意的地方。1、宏不能访问对象的私有成员。2、宏的定义很容易产生二意性。我们举个例子:#define square(x) (x*x)我们用一个数字去调......【阅读全文】
发布时间:2012-12-28 17:21:30
当有多个子进程的SIGCHLD信号到达父进程的时候,如果父进程用wait等待,那么父进程在处理第一个达到的SIGCHLD信号的时候,其他的SIGCHLD信号被堵塞,而且信号不被缓存,这样就会导致信号丢失,这样会产生很多的僵尸进程。。解决办法是父进程用waitpid来等待子进程信号。。。正好看到有人问这样一个问题看unix网络编程第一卷的时候,碰到书上这样一个例子: 一个并发服务器, 每一个客户端连接服务器就fork一个子进程.书上讲到当同时有n多个客户端断开连接时, 服务器端同时有n多个子进程终止, 这时候内核同时向父进程发送n多个sigchld信号.它的sigchld信号处理 函数如下......【阅读全文】
发布时间:2012-12-28 15:33:12
近日,程序开发用到了第一个第三方库,我自己的程序在main里,直接fork了一个子进程,父进程退出,发现fork出来的进程无法正常工作,如果不fork一切正常。经过研究第三方的代码,发现在第三方库里定义了一个全局变量,这个全局变量的初始化,启动了一个线程。现在问题就比较明确了。是我的程序在fork之前,主进程就有了其他的线程,主进程退出之后,线程即停止执行,造成子进程执行异常。示例代码如下: 点击(此处)折叠或打开#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <stri......【阅读全文】
发布时间:2012-12-26 13:59:52
Where 是一个约束声明,使用Where约束来自数据库的数据,Where是在结果返回之前起作用的,Where中不能使用聚合函数。Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行。而where子句在查询过程中执行优先级高于聚合语句。下面用一个例子进一步说明问题。假设有数据表:CREATE TABLE `test`.`salary_info` (  ......【阅读全文】
发布时间:2012-12-22 18:45:19
Linux TCP 连接数修改 一、 文件数限制修改(1) vi /etc/security/limits.conf* soft nofile 10240 * hard nofile 10240 (2) vi /etc/pam.d/loginsession required /lib/security/pam_limits.so 二、 网络端口限制修改(1) vi /etc/rc.d/rc.local/sbin/modprobe ip_conntrack # 加载 ip_contrack 模块# /sbin/sysctl –p ......【阅读全文】