摘要: 引言 首先需要明确,如何根据父亲结点的位置得知孩子结点的位置,以及如何根据孩子结点的位置得知父亲结点的位置。 假设数列索引从0开始,如果父亲结点的索引为i,那么左孩子索引为2i+1,右孩子索引为2i+2;如果孩子结点的索引为j,那么父亲结点的索引为(j-1)/2。 堆排序的核心在于函数 void adjustdown(int *arr, int i, int end) ,其中第i+1个元素到最后一... 阅读全文
posted @ 2014-09-03 16:50 Acjx 阅读(2082) 评论(0) 推荐(1) 编辑
摘要: 引言 快排采用分治法(Divide and Conquer)把一个list分为两个sub-lists。 算法步骤 1. 从数列中跳出一个元素,作为基准(pivot)。 2. 重新排序数列,所有比基准值小的元素(elements pivot)放在基准值后面,与基准值相等的数可以放在任意一边。此操作即为分区(partition)操作。 3. 递归地把小于基准值元素的子数列和大于基准值元素的子数列进... 阅读全文
posted @ 2014-09-02 21:07 Acjx 阅读(376) 评论(0) 推荐(0) 编辑
摘要: 一个函数在某一点的导数描述了这个函数在这一点附近的变化率。(微小的dx变化,引起多大的dy变化) 对于一个隐函数F(X)(X = {x0,x1,…,xn})而言,由于其在X的各个方向上变化速率和方向都是不同的,例如可以在x0方向上以线性方式变化,在x1方向上以平方级别方式变化等等,那么如果我们想知道在给定X附近F(X)的变化方向和速率,要如何刻画? 答案是梯度。梯度是F(X)对各个分量求偏导后的结... 阅读全文
posted @ 2014-09-01 23:13 Acjx 阅读(2225) 评论(0) 推荐(1) 编辑
摘要: 引言 每次使用socket通信,都会有很对相似的操作。本文,会对TCP与UDP通信做一简单封装,并生成动态库。 代码 my_socket.h #ifndef __MY_SOCKET_H__#define __MY_SOCKET_H__#include #include #include #include #include #include #include #include #define IN#... 阅读全文
posted @ 2014-09-01 20:58 Acjx 阅读(1503) 评论(1) 推荐(0) 编辑
摘要: 思路 主线程负责发送消息,另一线程负责接收消息。服务端和客户端均是如此。 注意 当A方close掉用于通信的socket端口后,该端口是不会立即关闭的。因为此时可能B方的信息还没send完。因此,此时A方的recv仍旧处于阻塞状态,会最后再等待收一次信息。此时,当B方send一个信息给A后,A方recv到后,A的socket端口就正式关闭了,A的recv返回-1。 此时由于A的socket端口已关... 阅读全文
posted @ 2014-08-31 16:42 Acjx 阅读(817) 评论(0) 推荐(0) 编辑
摘要: 需求 当客户端连接上服务器后,服务器会将相应文件传输给客户端,实现文件下载。 思路 服务器端,主进程负责listen。循环内,主进程每从任务请求队列中accept出一个请求,就fork出孙子完成文件传输。注意:如果只是fork出儿子,那么主进程就得wait儿子,这样的话,只有当给一个客户端传完文件后才能下一个。 代码 server端 /*******************************... 阅读全文
posted @ 2014-08-31 12:27 Acjx 阅读(2090) 评论(0) 推荐(0) 编辑
摘要: 引言 本文实现的功能类似于我之前所写的一篇博文(Linux之select系统调用_2),区别在于进程之间的通信方式有所不同。之前的文章中,我所使用的是管道,而本文我将会使用socket接口。 需求 客户端发送消息给服务器,服务器收到消息后,会转发该消息给所有客户端。 思路 1. server端维护一个链表,用于存放客户端的联系方式。结构如下: typedef struct sockaddr_in ... 阅读全文
posted @ 2014-08-30 00:14 Acjx 阅读(1475) 评论(0) 推荐(0) 编辑
摘要: TCP与UDP通信流程 TCP通信的基本步骤如下: 服务端:socket---bind---listen---while(1){---accept---recv---send---close---}------close 客户端:socket------------------------------connect---send---recv-----------------close UDP... 阅读全文
posted @ 2014-08-29 21:50 Acjx 阅读(743) 评论(0) 推荐(0) 编辑
摘要: 宏定义 首先介绍两个宏定义,看如下代码 代码1 /************************************************************************* > File Name: test.c > Author: KrisChou > Mail:zhoujx0219@163.com > Created Time: Thu 28 Aug 2014... 阅读全文
posted @ 2014-08-28 17:04 Acjx 阅读(438) 评论(0) 推荐(0) 编辑
摘要: socket信息数据结构 #include struct sockaddr { unsigned short sa_family; /*地址族*/ char sa_data[14]; /*14字节的协议地址,包含该socket的IP地址和端口号。*/};struct sockaddr_in { short int sa_family; ... 阅读全文
posted @ 2014-08-28 01:25 Acjx 阅读(446) 评论(0) 推荐(0) 编辑
摘要: 数据存储优先顺序的转换 计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。内存的低地址存储数据的低字节,高地址存储数据的高字节的方式叫小端模式。内存的高地址存储数据的低字节,低地址存储数据高字节的方式称为大端模式。 eg:对于内存中存放的数0x12345678来说(注意,对于数据而言,此处12是高字节,78是低字节;对于地址而言,左边是低地址,右边是高地... 阅读全文
posted @ 2014-08-27 22:43 Acjx 阅读(1957) 评论(0) 推荐(0) 编辑
摘要: 需求 客户端将需要解决的task发送给服务器,服务器调用线程来解决客户端发送的task,解决完由线程负责将其发送回客户端。(用管道实现通信) 思路 1. server维护两个列表。一是客户端列表。二是任务列表。分别如下: /* 客户端列表 */ typedef struct tag_fds{ int s_rfd ; int s_wfd ; struct tag_fds* s... 阅读全文
posted @ 2014-08-27 01:20 Acjx 阅读(360) 评论(0) 推荐(0) 编辑
摘要: 思路 生产者和消费者(互斥与同步)。资源用队列模拟(要上锁,一个时间只能有一个线程操作队列)。 m个生产者。拿到锁,且产品不满,才能生产。当产品满,则等待,等待消费者唤醒。当产品由空到不空,通知消费者。n个消费者。拿到锁,且有产品,才能消费。当产品空,则等待,等待生产者唤醒。当产品由满到不满,通知生产者。 生产者条件:队列不满消费者条件:队列不空因此有两个条件变量。 代码 /***********... 阅读全文
posted @ 2014-08-27 00:07 Acjx 阅读(913) 评论(0) 推荐(0) 编辑
摘要: 引言 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待条件变量的条件成立而挂起(此时不再占用cpu);另一个线程使条件成立(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。 函数原型 1. 定义条件变量 #include /* 定义两个条件变量 */pthread_cond_t cond_pro, cond_con;2. 初始化和销毁... 阅读全文
posted @ 2014-08-26 21:43 Acjx 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 引言 先看以下两个信号量: 13)SIGPIPE 当管道读端关闭,再往管道写东西,会发出SIGPIPE信号 17)SIGCHLD 子进程退出会向父进程发出SIGCHLD信号,系统默认处理是忽略掉该信号 代码 /************************************************************************* > File Name: my_fo... 阅读全文
posted @ 2014-08-26 00:13 Acjx 阅读(262) 评论(0) 推荐(0) 编辑
摘要: 函数原型 NAME signal - ANSI C signal handlingSYNOPSIS #include typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);signal函数具有注册功能,什么事都不干。只是告诉系... 阅读全文
posted @ 2014-08-25 23:29 Acjx 阅读(353) 评论(0) 推荐(0) 编辑
摘要: 题目 共要卖票20张,由命令行输入窗口数,由线程模拟窗口。每卖掉一张票,屏幕显示由几号窗口所卖,一并显示剩余票数 思路 由于票数 ticket_cnt 是全局变量,因此每当一个线程将其减一(卖出一张票),并将其显示,应该被封装为一个原子操作。因为线程是并发执行的,可能当前线程将ticket_cnt减1后还没有来得及显示此时的剩余票数ticket_cnt,ticket_cnt已经被另一个线程减一了。... 阅读全文
posted @ 2014-08-25 22:15 Acjx 阅读(577) 评论(0) 推荐(0) 编辑
摘要: 思路 先将字符串中的单词分割保存至二维数组中,再经排序后输出。水题,直接上代码了。 代码 /************************************************************************* > File Name: words_sort.c > Author: KrisChou > Mail:zhoujx0219@163.com... 阅读全文
posted @ 2014-08-24 21:45 Acjx 阅读(437) 评论(0) 推荐(0) 编辑
摘要: 思路 每次内部循环需要找到一个单词,将其存入数组。外循环遍历至字符串末尾结束。 代码 /************************************************************************* > File Name: word_split.c > Author: KrisChou > Mail:zhoujx0219@163.com ... 阅读全文
posted @ 2014-08-24 12:42 Acjx 阅读(1320) 评论(0) 推荐(0) 编辑
摘要: 题目很水,我想代码应该就是最好的注释,实现如下: /************************************************************************* > File Name: trim_space.c > Author: KrisChou > Mail:zhoujx0219@163.com > Created Time: ... 阅读全文
posted @ 2014-08-24 10:28 Acjx 阅读(904) 评论(0) 推荐(0) 编辑