- 博客(26)
- 资源 (5)
- 收藏
- 关注
原创 进程会话
Unix操作系统调度的基本单位是进程,单个或多个进程组成进程组,单个或多个进程组则组成会话。其关系示意图如下:进程组#include pid_t getpgrp(); // 返回调用进程的进程组IDpid_t getpgid(pid_t pid); // 返回指定进程的进程组ID,若失败返回-1int setpgid(pid_t pid, p
2015-06-15 23:50:00
766
原创 进程控制
进程控制函数创建子进程#include int fork(); // 子进程中返回0,在父进程中返回子进程ID,出错返回-1int vfork(); // vfork与fork在语义上一致,但vfork不会复制父进程空间,用vfork创建的子进程以与父进程共享地址空间的方式运行;另外调用vfork后父进程将会阻塞,直到子进程调用exit或exec为
2015-06-15 23:45:13
560
原创 文件I/O
基本文件操作函数#include int open(int filedes, int filestate, ...); // 失败返回-1, 成功返回文件描述符int close(int filedes);int lseek(int filedes, int offset, int fromwhere); // 随机访问文件,失败返回-1,成功返回文
2015-06-15 23:32:41
609
原创 进程概要
C程序内存布局进程退出函数void _exit(int status);void _Exit(int status);voit exit(int status);void atexit(void (*func)()); // 注册进程退出时调用的函数
2015-05-30 22:53:30
648
原创 关于设计窗口定时器类的一点思考(2013-03-17)
问题是这样的,一个父窗口有很多子窗口,而这些子窗口都需要定时更新自身的数据。 对于这个问题看上去最简单的一个办法就是为每一个窗口都创建一个定时器,然后分别处理,但这样做,代码量势必很大,而且当父窗口需要增加子窗口时对代码结构的影响必定会很大。所以,我没有采用这样的办法,很多表面上看起来很简单的东西也不必急着动手,仔细想想,说不定有更简单的方法。 一个很朴素的想法是将定时器抽象成
2013-03-17 21:13:41
1262
原创 分享一道关于素数的笔试题
题目:请写代码打印10000之内的素数,讲求效率! 说实话,这年代如此这般简单的笔试题还真是不多见了,不过今天被我有幸遇到了!虽然我丝毫也高兴不起来,因为我知道笔试再好,面试那关也难过!不知道是不是点背的关系,每次面试总是感觉良好,事后却总无回音。我从自己身上找呀找呀找原因,找到很多。比如,有项目经验,却无大型项目开发经验,而且项目经验并非多得不得了。 还有就是行业原因,比如,
2012-09-14 16:30:12
1237
原创 通用散列表
用散列表存储数据在理论上能做到常量级的查询或插入时间复杂度。散列表中最核心的是求取哈希值。有集合R、有限整数集Z,将R映射到Z的函数称为散列函数。 整数的散列函数可以为取模函数,因为整数域中的任何元素总可以通过取模操作被限制到一定范围内; 字符串的散列函数有很多,不一一列举; 结构体的散列函数则可以视结构体的具体结构而定。 ...... 题为“通用
2012-09-09 22:22:59
1165
原创 简单的回射程序
《UNIX网络编程》很多章节都用回射程序来作例子,因为该程序逻辑简单——客户端只管读终端,然后发送读取的字符串;服务器只管读取客户端发送来的字符串,然后回射回去。 回射服务器代码:#include #include #include #include #include #include #include #include #include #include ty
2012-08-19 18:22:55
1445
原创 UNIX网络编程
《UNIX网络编程》确实是一本不可多得的好书,它之优势不仅在于其理论透彻,其编程实例也讲的很清晰。说来惭愧,在刚开始看UNIX编程三件套的时候,只觉得这三本书完全是POSIX API的参考手册。然而看下来才发现,里面不仅有深刻的计算机理论知识,而且通篇也渗透了各种编程技巧。说实话,如果吃透这三本书,编程水平一定能上一个台阶。 《UNIX网络编程》不仅是我进行网络编程工作时的参考书,同时偶
2012-08-19 17:47:14
1208
1
原创 双连通分量
在无向连通图中,如果删除该图的任何一个结点都不能改变该图的连通性,则称该图是双连通的。双连通无向图一定是连通的,而连通的无向图则不一定是双连通的。对于一个连通的无向图也有双连通分量的概念,定义自然不言而喻。 同样,我们也可以利用tarjan算法求双连通分量。#define N 10000struct Edge{ int to,next;}e[100000];int e
2012-08-17 13:36:35
904
原创 强连通分量
对于有向图的一个顶点集,如果从这个顶点集的任何一点出发都可以到达该顶点集的其余各个顶点,那么该顶点集称为该有向图的一个强连通分量。有向连通图的全部顶点组成一个强连通分量。 我们可以利用tarjan算法求强连通分量。#define N 1000struct Edge{ int to,next;}e[100000];int ec,pp[N],n;int dfn[N],l
2012-08-17 13:28:15
1184
原创 最大权匹配算法(km)
二分图的最大权匹配就是求所有匹配中权值最大的匹配。char str[105][105];int node[105][105],w[105][105],n,lx[105],ly[105],link[105];bool visx[105],visy[105];bool Find(int a){ visx[a]=true; int j; for(j=1;j<=n;j+
2012-08-17 11:41:30
1523
原创 二分图匹配
二分图匹配是可以转换为网络流求解的,但直接用匈牙利算法求解比转换为网络流求解更高效。 关于二分图有很多公式,比如它与最小顶点覆盖的关系、与最小路径覆盖的关系等等。这里就不进一步讨论了。#define N 1000int n;//二分图左边节点数int m;//二分图右边节点数bool edge[N][N],vis[N];int link[N];bool Find(int
2012-08-17 11:28:34
792
原创 网络流
如果只从网络流的定义来看,它能求解的问题似乎很少,但如果考虑到转换的思想,则很多看起来与网络流丝毫不沾边的问题也能用网络流来解,这也是为什么网络流在ACM比赛中被列为较难题的原因所在。 我这里不打算讨论怎么对一个问题建立网络流模型,说句实在话,我也无从讨论这个。如果将适于用网络流解决的问题看成是一个集合,那么这个集合是趋于无穷的,如果按照某种规则对它们进行分类组成另外一个问题分类集,那么
2012-08-17 10:40:40
2958
原创 最小生成树算法
最小生成树算法我只知道两种:Prim和Kruscal。 Prim算法跟Dijkstra算法一样,属于典型的贪心算法(即从局部最优解得到全局最优解)。 下面是Prim算法用于以邻接矩阵保存的图的情况。#define N 1000int edge[N][N],closedge[N],n;bool vis[N];void prim(int s){ int i,j
2012-08-17 10:00:21
1098
原创 最短路径算法
先从最简单的入手!图用邻接矩阵保存,算法为Dijkstra单源最短路径算法。#define N 1000#define Inf 9999999int edge[N][N],dist[N],n,vis[N];void dij(int s){ int i,j,k; for(i = 1; i <= n; i++) dist[i] = edge[
2012-08-17 09:40:51
659
原创 POSIX多线程基础
在我写多线程程序的时候总是遵循这样的顺序:初始化资源->开启线程;停止线程->将资源去初始化。 包含头文件:#include #include 全局定义:sem_t g_sem;pthread_t g_tid;pthread_attr_t g_attr;BOOL g_thread_runflag;void*
2012-08-16 21:09:29
667
原创 emacs配置文件——.emacs
在emcas启动后会首先加载.emacs文件,该文件在HOME目录下。对于linux而言,HOME目录就是你的用户目录,可以用"cd ~"命令进入该目录;而对于windows而言,HOME目录则需要你自己在环境变量选项中配置(我的电脑->属性->高级->环境变量)。 有些人热爱emacs并为此去学lisp,只为将自己的emacs变得更好用。可能是功力不够的原因,我无法理解其动力。
2012-07-26 15:36:16
872
原创 lisp——遍历目录
lisp是一门强大的语言无可否认,但有时候lisp还是免不了很二,比如:遍历目录! 不管是用C还是python想要遍历指定的目录都很简单,而且跨平台也很容易;但对于lisp如果你想遍历一个目录下的所有文件,情况则没那么简单。首先你得清楚路径名的概念,然后,对于不同的lisp实现你得编写不同的代码,最后,你还得考虑windows与linux或者其他操作系统在目录结构上的差异。总之,如果你一
2012-07-26 14:53:50
3587
原创 队列
头文件:#ifndef __MYQUEUE_H__#define __MYQUEUE_H__#define ret_val_if_fail(p, val)\ if (!(p)){printf("%s:%d error: "#p" failed.\n", __func__, __LINE__); return val;}#define ret_if_fail(p)\ if
2012-07-26 13:17:05
563
原创 网络数据收发通用代码
对于任何一个支持网络通信的应用程序,它都有其自身的应用层通信协议。该协议规定了应用程序发送什么样格式的网络数据或接收到某某数据时回送的数据格式。该协议是由应用层相关人员定制的。 不同的应用程序有各自不同的网络数据处理模块,这似乎是不可移植的,但网络数据的发送和接收则是独立于具体的应用层协议的。网络数据的发送和接收模块只与底层平台(操作系统)相关,而与应用层协议无关,它们只负责数据收发的稳
2012-07-25 13:49:05
2054
原创 字典树
有一个存放英文单词的文本文件,现在需要知道某些给定的单词是否在该文件中存在,若存在,它又出现了多少次? 这样的问题解法有多种,普通青年直接暴力查找,稍文艺点的用map。顺序查找的话,每给定一个单词就得遍历整个字符串数组,时间开销实在太大;如果将所有的单词都存放在一个map中,每次查找的时间复杂度则降为O(log(n))。不得不说,对于一般的应用场景,map足够满足所有需求。 但
2012-07-24 23:34:26
3495
原创 通用二分查找
这是极其简单的一个算法,正是因为其简单,我经常被其搞死。不管是在比赛时还是在面试时,我都在这上面栽过跟头。因为其简单,所以总也不愿花过多时间来写它,总想一气呵成,但总也呵不成,于是脑袋越来越混乱,情绪越来越激动,于是悲剧随之而来。 二分查找要求被查找数组是排好序的数组,其时间复杂度为O(log(n)),也就是说1亿的数据量大概运行26次就能求出结果。#include #incl
2012-07-24 19:36:30
867
2
原创 通用归并排序
用支持递归的语言实现归并排序是很简单的。假设m_sort可以将一个数组排序,那么m_sort的递归逻辑为:(m_sort的定义为void m_sort(void* arr, int left, int right)) 基础:当right 归纳:求得left和right的中间值mid = (left + right) / 2,将m_sort作用于数组区间[left, mid]和[
2012-07-24 17:56:04
550
1
原创 通用快排
在快排中,这样的数组元素被称为枢轴——其前面的元素全都小于它(或大于),其后面的元素全都大于它(或小于)。如此,我们很容易想到,对于一个数组,如果其全部元素都可以被称为枢轴,那么,该数组就是一个已经排序好的数组。 参考代码:#include #include #include static int partition(void* arr, int(*cmp)(void*, v
2012-07-24 16:49:31
820
1
原创 如何避免死锁
用互斥量实现同步时如何避免死锁? 当我们对一段代码加锁后忘了解锁,我们的程序就很有可能出现死锁的现象。这样的错误我们一般是会小心避免的,但也绝不能保证永远都不犯。真当出现死锁而代码量又很大的时候,问题常常很难被发现,因为多线程程序的调试常常很麻烦。 那么有没有办法实现自动解锁机制呢?当然有!我们很容易联想到类的构造和析构函数,因为这两者会在对象被创建和销毁的时候被自动调用。
2012-07-22 19:59:14
3122
2
即时通讯小软件源码(控制台)
2012-07-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人