
应用编程
文章平均质量分 71
dai_weitao
毕业于北京工业大学计算机专业.
从事LINUX/UNIX下的C/C 语言开发工作.
主要工作是服务器端应用程序开发, 自学LINUX DEVICE DRIVER和KERNEL.
现就职方正国际
展开
-
Linux进程间通信: 消息队列
Linux的消息队列(queue)实质上是一个链表, 它有消息队列标识符(queue ID). msgget创建一个新队列或打开一个存在的队列; msgsnd向队列末端添加一条新消息; msgrcv从队列中取消息, 取消息是不一定遵循先进先出的, 也可以按消息的类型字段取消息. 1. 标识符(des)和键(key): 消息队列, 信号量和共享存储段, 都属于内核中的IPC原创 2007-08-13 13:13:00 · 2633 阅读 · 1 评论 -
Linux Signal (7): sigaction
sigaction函数是用作检查/修改与指定信号相关联的处理动作. 在UNIX早期版本中使用signal, 后来改用了sigaction, 可见它的功能比signal要强大. 另外, signal函数也是可以用sigaction实现的.1. sigaction原型:#include signal.h>int sigaction(int signo, const struct sigac原创 2007-09-27 17:02:00 · 7044 阅读 · 4 评论 -
ProC中使用宏的预处理流程
ProC中常见的是使用宏来管理常用的数据库操作命令. 比如:#define GetName() EXEC SQL select name / from TBL_MEMBER这样定义了宏, 在以后的代码中可以直接用GetName()来实现这几行SQL语句的操作了.但是, 这产生了一个问题:宏的替换是在gcc的编译期中的预处理原创 2007-10-31 11:29:00 · 2510 阅读 · 0 评论 -
Oracle Pro*C 动态SQL技术
Pro*C的常用动态SQL技术一共有3种: 用于处理不包含宿主变量的动态SQL, 不能用于SELECT语句. 用于处理输入宿主变量个数和类型已经确定的动态SQL, 不能用于SELECT语句. 用于处理选择列表项和输入宿主变量个数已经确定的动态SQL, 此种方法可以处理所有前两种方法能处理的情况, 此外, 还能处理SELECT语句. 由于第3种方法已经包原创 2007-11-06 18:13:00 · 3102 阅读 · 5 评论 -
自己写的一个通用链表
最近给自己正在做的项目写了一个链表代码, 主要用于PRO*C的select数据查询结果的存储. 发到上面来分享一下, 代码很短.db_list.h:#ifndef DB_LIST_H#define DB_LIST_H/* List node structure */typedef struct db_list_node{ void *data; /*原创 2007-12-10 17:35:00 · 1780 阅读 · 1 评论 -
XML DOM解析
1 DOM原理:由于XML文件可以视为一个树型数据结构,DOM就是把这文档读到一棵树中,放到内存里,然后通过DOM提供的函数进行解析的一种XML解析方法。 2 DOM结点类型:DOM结点有以下几种类型,可以通过XmlDomGetNodeType()方法获得返回值(int)。ELEMENT_NODE=1ATTRIBUTE_NODE=2TEXT_NODE=3CDATA_原创 2008-01-03 15:38:00 · 1889 阅读 · 1 评论 -
XML文件写入
前面文章已经介绍了XML文件的DOM解析方法, 这篇文章简单说明一下写入. 我自己用fprintf封装了几个函数, 具体如下, 很容易看懂:cs_xml.h#ifndef CS_XML_H#define CS_XML_H#include stdio.h>/* Add a node and a value(string) to XML */int xml_add_node_val_s原创 2008-01-17 12:55:00 · 1407 阅读 · 0 评论 -
ORACLE查询树型关系(connect by prior start with)
connect by prior start with 经常会被用到一个表中存在递归关系的时候。比如我们经常会将一个比较复杂的目录树存储到一个表中。或者将一些部门存储到一个表中,而这些部门互相有隶属关系。这个时候你就会用到connect by prior start with。典型的使用方法就是:select * from table connect by prior cur_id=paren转载 2008-04-30 10:48:00 · 1846 阅读 · 0 评论 -
LINUX下建立临时文件: mkstemp
LINUX下建立临时的方法(函数)有很多, mktemp, tmpfile等等. 今天只推荐最安全最好用的一种: mkstemp.mkstemp (建立唯一临时文件)头文件: #include stdlib.h>声明: int mkstemp(char *template)返回值: 成功则返回0, 失败则返回-1.说明: 建立唯一临时文件名, template须以数组形式声明而非原创 2008-05-20 00:11:00 · 11745 阅读 · 3 评论 -
ORACLE TO_CHAR
The following are number examples for the to_char function. to_char(1210.73, 9999.9) would return 1210.7 to_char(1210.73, 9,999.99) would return 1,210.73 to_char(1210.73, $9,999.00) wo转载 2008-06-04 17:23:00 · 1997 阅读 · 2 评论 -
Linux下的setjmp和longjmp
在LINUX下有一组标准跳转函数, 类似于编程中的局部跳转goto, 原型如下:#include int setjmp(jmp_buf env);返回值: 若直接调用则返回0, 若从longjmp调用返回则返回非0值.void longjmp(jmp_buf env, int val); 这次用伪码举例:#include #define ERR_U原创 2009-08-11 15:30:00 · 2262 阅读 · 0 评论 -
Linux Signal (8): sigsetjmp和siglongjmp
进程部分介绍过了setjmp和longjmp函数, 这两个函数在跳转时会带信号屏蔽字跳转, 在信号处理程序(hanlder)中使用longjmp会导致后来产生的这种信号被屏蔽.POSIX.1 也没有具体说明setjmp和longjmp对信号屏蔽字的作用, 而是定义了两个新函数: sigsetjmp和siglongjmp.1. 原型:#include setjmp.h>int sig原创 2007-09-28 11:12:00 · 13742 阅读 · 4 评论 -
Linux Signal (6): 信号屏蔽字
1. 概念:信号屏蔽字就是进程中被阻塞的信号集, 这些信号不能发送给该进程, 它们在该进程中被"屏蔽"了. 后面我们会提到, 实际上它们是被阻塞了.2. 信号屏蔽函数:#include signal.h>int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);成功则返回0,原创 2007-09-25 15:46:00 · 13496 阅读 · 2 评论 -
Linux Signal (3): kill和raise
1. 函数说明:kill和raise是用来发送信号的:kill把信号发送给进程或进程组;raise把信号发送给(进程)自身.他们的原型如下:#include signal.h>int kill(pid_t pid, int signo);int raise(int signo);成功则返回0, 出错则返回-1 从原型上可以看出, raise函数是可以通过kill实现原创 2007-09-24 16:23:00 · 9511 阅读 · 0 评论 -
Linux线程同步(1): 概要
线程的同步, 发生在多个线程共享相同内存的时候, 这时要保证每个线程在每个时刻看到的共享数据是一致的. 如果每个线程使用的变量都是其他线程不会使用的(read & write), 或者变量是只读的, 就不存在一致性问题. 但是, 如果两个或两个以上的线程可以read/write一个变量时, 就需要对线程进行同步, 以确保它们在访问该变量时, 不会得到无效的值, 同时也可以唯一地修改该变量并原创 2007-08-15 18:32:00 · 2108 阅读 · 0 评论 -
Linux线程同步(2): 互斥量(mutex)
互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1. 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化:对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER, 或者调用pthread_mutex_init.对于动态分配的互斥量, 在申请内存(malloc)之后原创 2007-08-17 18:18:00 · 5441 阅读 · 0 评论 -
Linux线程同步(3): 读写锁(rwlock)
在线程同步系列的第一篇文章里已经说过, 读写锁是因为有3种状态, 所以可以有更高的并行性.1. 特性: 一次只有一个线程可以占有写模式的读写锁, 但是可以有多个线程同时占有读模式的读写锁. 正是因为这个特性, 当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞. 当读写锁在读加锁状态时, 所有试图以读模式对它进行加锁的原创 2007-08-21 14:41:00 · 19703 阅读 · 3 评论 -
Linux线程同步(4): 条件变量
条件变量分为两部分: 条件和变量. 条件本身是由互斥量保护的. 线程在改变条件状态前先要锁住互斥量. 1. 初始化: 条件变量采用的数据类型是pthread_cond_t, 在使用之前必须要进行初始化, 这包括两种方式: 静态: 可以把常量PTHREAD_COND_INITIALIZER给静态分配的条件变量. 动态: pthread_cond_init原创 2007-08-22 19:39:00 · 6634 阅读 · 0 评论 -
GTK编程初谈
GTK是一个跨平台的GUI开发库, 它是用C语言以OO的方式(俗称面向对象C, 又称OO-C)开发的. 只要是有一定C语言和GUI开发基础, 用GTK是一件很简单的事.1. 安装与配置:由于我使用的是Ubuntu Linux, 重点只介绍Ubuntu下的GTK开发库安装方法:sudo apt-get install vim-full ;我是vi的忠实用户,原创 2007-08-22 22:25:00 · 8160 阅读 · 8 评论 -
I/O的多路转接: select
1. 概念: I/O多路转接技术, 是先构造一张有关描述符的列表, 然后调用一个函数, 直到这些描述符中的一个已准备好进行I/O时, 该函数才返回. 在返回时, 它告诉进程哪些描述符已经准备好可以进行I/O. 在Linux下poll, pselect, select这三个函数都可以执行I/O多路转接操作, 今天我们主要说select函数. 2. select函数:原创 2007-08-30 16:27:00 · 1688 阅读 · 0 评论 -
Linux Signal (2): signal函数
1. 原型:#include signal.h>void (*signal(int signo, void (*func)(int))(int);成功则返回该信号以前的处理配置, 出错则返回SIG_ERR.参数说明: signo: 信号名, 如SIGINT. func: 对应signo的信号处理函数的函数名, 这个函数没有返回值, 有一个整型参数, 这是捕捉原创 2007-09-14 14:43:00 · 6047 阅读 · 0 评论 -
Linux Signal (1): 基本概念
1. 信号是软件中断:信号提供了一种处理异步事件的方法. 每个信号都有一个名字, 他们以SIG开头, 如SIGALRM是闹钟信号, 当由alarm函数设置的计时器超时后产生此信号, 然后由SIGALRM的信号处理函数接管处理, 处理之后返回调用alarm函数的应用程序中.2. 信号编号:在头文件中, 信号都用宏定义为正整数的信号编号, 不存在编号为0的信号, kill函数对编号为0原创 2007-09-14 10:51:00 · 6414 阅读 · 1 评论 -
Linux Signal (4): alarm和pause
1. alarm函数:alarm函数是设置一个计时器, 在计时器超时的时候, 产生SIGALRM信号. 如果不忽略或捕捉此信号, 它的默认操作是终止调用该alarm函数的进程.原型如下:#include unistd.h>unsigned int alarm(unsigned int seconds);返回0或余留秒数说一下alarm的返回值问题, 每个进程只能有一个ala原创 2007-09-25 11:21:00 · 10923 阅读 · 0 评论 -
Linux Signal (5): 信号集
信号集给我们提供了一个能表示多个信号的是数据类型(sigset_t), 它将在sigprocmask, sigpending, sigsuspend之类的函数中用到, 这些函数我会在以后的文章中介绍.1. 信号集相关函数:#include signal.h>int sigemptyset(sigset_t *set);成功则返回0, 出错则返回-1. 这个函数用作初始化set指原创 2007-09-25 13:05:00 · 15097 阅读 · 0 评论 -
Python hello world
<br />最近开始学习python, 由于是windows端, 只能下个python for windows.<br />按照惯例,先来个hello world<br /> <br />#!/usr/bin/python'My first python script'mystr = 'hello world'print(mystr) <br /> <br />执行结果:<br /><br />.<br />>>> ================================ RESTART原创 2010-12-29 01:30:00 · 1272 阅读 · 0 评论