编程小技巧
宏中的# 和 ##号运用
struct setting_plugin {
const char *name;
int (*init)();
void (*exit)();
void (*show)();
}
//这样定义,可以使得函数向前兼容。
#define SETTING_PLUGIN_DEFINE(name, init, exit, a...) \
struct setting_plugin setting_plugin = { \
#name, init, exit, ##a\
}
安装lib文件到指定目录
./configure --prefix=/usr/ --libdir=/usr/lib/desktop/plugins/
打开关闭动态库注意事项
/* 在使用dlopen,dlclose打开关闭动态库时。一定要注意。在调用dlclose之前,必须将动态库中所有的资源全部清空掉,才能正常关闭. 否则可能会造成段错误。 */
如: 我在程序中有如下操作
(1) pthread_create
(2) g_timeout_add();
(3) dbus_add_signal_filter();
将上面的操作清空后,才可以执行dlclose();
稳妥的结束线程方法:
pthread_cancel(threadid);
int r = pthread_join(news_priv.pthread, &ret);/*注:这里会阻塞在这里。*/
if (r != 0) {
/* r is the error number *
}
原理:调用dlopen之后,将动态库加载到内存中,当我们设定好一些回调函数,或执行一下线程。当我们执行
dlclose(),并且没有其他的应用打开该动态库,将会把它从内存中卸载。而如果回调还会继续执行,这是回调指针(野指针)指
向的地址就不知道是哪里了!
spec
/**setup 参数*************************** %setup 不加任何选项,仅将软件包打开。 %setup -n newdir 将软件包解压在newdir目录。 %setup -c 解压缩之前先产生目录。 %setup -b num 将第num个source文件解压缩。 %setup -T 不使用default的解压缩操作。 %setup -T -b 0 将第0个源代码文件解压缩。 %setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。 %patch 最简单的补丁方式,自动指定patch level。 %patch 0 使用第0个补丁文件,相当于%patch ?p 0。 %patch -s 不显示打补丁时的信息。 %patch -T 将所有打补丁时产生的输出文件删除。 *************************************/
socket细节:read 收包,判断是否一个接收已经完成了。
/* 文件,socket 同理,read返回0时,才表示文件尾/数据包尾 */ while(read(sock, buf, sizeof(buf)-1)) { //数据放入缓冲区 } /*********************************** 同时有如下内部逻辑 TCP协议是面向流的,read和write调用的返回值往往小于参数指定的字节数。对于read调用,
如果接收缓冲区中有20字节,请求读100个字节,就会返回20。对于write调用,如果请求写100个字节,
而发送缓冲区中只有20个字节的空闲位置,那么write会阻塞,直到把100个字节全部交给发送缓冲区才返回,
但如果socket文件描述符有O_NONBLOCK标志,则write不阻塞,直接返回20 ***********************************/
linux自定义启动项
/******************************* /etc/rc.d/rc.sysinit *******************************/
/***************************************** rpmbuild 中,cmake 时,可以增加如下命令。看清详细的编译选项。 make VERBOSE=1 %{?_smp_mflags} *****************************************/
malloc宏
#define toy_new(type) (type *)malloc(sizeof(type))
浙公网安备 33010602011771号