摘要: word-doc矩阵在进行文件分类或文档检索的时候,我们通常需要建立一个word-doc矩阵,来记录每个词在每篇文档中出现的次数。class Mapper method map(docid id,doc d) foreach term in d Emit(pair(term,id),1)一种更高效的方法是在mapper侧进行聚合。class Mapper method map(docid id,doc d) H := new AssociativeArray foreach term in d H{term} := H{term}+1 foreach term in H E... 阅读全文
posted @ 2012-08-05 23:48 张朝阳 阅读(1447) 评论(0) 推荐(0) 编辑
摘要: 本文介绍几种MapReduce算法设计的技巧,全部内容翻译自《Data-Intensive Text Processingwith MapReduce》。Local Aggregation说到Local Aggregation,你可能会想不就是Combiner吗。实际上在mapper中进行combining比使用真正的combiner高效得多。首先combiner只是作为MapReduce的可选优化方案(就像inline对于C++编译器是一种可选优化方案一样),不一定会被执行。其次在mapper中进行combining可以减少很多的I/O操作,提高效率,毕竟mapper的每个结果都个结果都要被 阅读全文
posted @ 2012-08-05 19:12 张朝阳 阅读(4567) 评论(0) 推荐(1) 编辑
摘要: 本文试图用最简单的例子、最浅显的方式说明EM(Expectation Maximization)算法的应用场景和使用方法,而略去公式的推导和收敛性的证明。以下内容翻译自《Data-Intensive Text Processingwith MapReduce》。Maximum Likelihood EstimationMaximum Likelihood Estimation(MLE)是要选择一个最佳参数θ*,使得从训练集中观察到和情况出现的概率最大。即模型:举例来说明。如下图一个小黑球沿着一个三角形的木桩滚入杯子a或b中,可建立一个概率模型,由于是二值的,设服从Bernoulli分布,概率密 阅读全文
posted @ 2012-08-05 09:39 张朝阳 阅读(30525) 评论(4) 推荐(7) 编辑
摘要: 首先说明我对这些概念也不是很清楚,以下内容是我做的一些理事。同步和异步、阻塞和非阻塞这是两组概念,说的是不同的事情,同步和阻塞没有必然的联系,异步和非阻塞也没有必然的联系。同步和异步是只跟IO操作过程中进程的状态变化有关。阻塞和非阻塞就是进程的两种状态。比如你去银行,排除的话就是一种同步的方式,叫号的话就是异步的方式。排队必须自己看着什么时候轮到自己,而叫号则不必,轮到你的时候会触发一个事件,或者说你会收到一个信号,别人会叫你。不管是排除还是叫号,如果你在等待的过程中不能做其他事情,那就是阻塞模式,否则就是非阻塞模式。同步的时候可以有阻塞和非阻塞,异步的时候也可以有阻塞和非阻塞。阻塞 I/OL 阅读全文
posted @ 2012-07-31 17:59 张朝阳 阅读(7762) 评论(1) 推荐(0) 编辑
摘要: Linux/Unix下安装Perl模块有两种方法:手工安装和自动安装。第一种方法是从CPAN上下载 您需要的模块,手工编译、安装。第二种方法是联上internet,使用一个叫做CPAN的模块自动完 成下载、编译、安装的全过程。 a、手工安装的步骤: 从CPAN下载了DBI模块1.13版的压缩文件DBI-1.13.tar.gz,假设放在/usr/local/src/下。 cd /usr/local/src 解压缩这个文件: tar xvzf DBI-1.13.tar.gz 这时会新建一个DBI-1.13的目录。 cd DBI-1.13 生成makefile: perl Makefile.PL . 阅读全文
posted @ 2012-07-26 18:41 张朝阳 阅读(53934) 评论(0) 推荐(0) 编辑
摘要: This is guidance for those with integrated Realtek RTL8111 series gigabit Ethernet, built in to motherboards such as the ASRock G41M-LE.Ubuntu 8.10 (and may other versions) have been reporting problems with connectivity. Here is the solution in a walk-through format. You must be root (sudo su -).1) 阅读全文
posted @ 2012-07-23 14:48 张朝阳 阅读(716) 评论(0) 推荐(0) 编辑
摘要: 梯度的方向与等值面垂直,并且指向函数值提升的方向。 二次收敛是指一个算法用于具有正定二次型函数时,在有限步可达到它的极小点。二次收敛与二阶收敛没有尽然联系,更不是一回事,二次收敛往往具有超线性以上的收敛性。一阶收敛不一定是线性收敛。 解释一下什么叫正定二次型函数: n阶实对称矩阵Q,对于任意的非0向 阅读全文
posted @ 2012-07-21 14:56 张朝阳 阅读(17222) 评论(3) 推荐(4) 编辑
摘要: RBF网络能够逼近任意的非线性函数,可以处理系统内的难以解析的规律性,具有良好的泛化能力,并有很快的学习收敛速度,已成功应用于非线性函数逼近、时间序列分析、数据分类、模式识别、信息处理、图像处理、系统建模、控制和故障诊断等。简单说明一下为什么RBF网络学习收敛得比较快。当网络的一个或多个可调参数(权值或阈值)对任何一个输出都有影响时,这样的网络称为全局逼近网络。由于对于每次输入,网络上的每一个权值都要调整,从而导致全局逼近网络的学习速度很慢。BP网络就是一个典型的例子。如果对于输入空间的某个局部区域只有少数几个连接权值影响输出,则该网络称为局部逼近网络。常见的局部逼近网络有RBF网络、小脑模型 阅读全文
posted @ 2012-07-14 21:06 张朝阳 阅读(198522) 评论(22) 推荐(14) 编辑
摘要: 对偶传播神经网络(Counter-Propagation Network,CPN)能存储二进制或模拟值的模式对,因此这种网络模型也可用于联想存储、模式分类、函数逼近、统计分析和数据压缩等功能。对偶传播神经网络的拓扑结构跟误差反向传播(BP)网络的一样,不同之处在于,CPN采用两个阶段来分别训练竞争层的内星权向量和外星权向量,即第一阶段完全不顾输出层,采用SOFM的方法来训练竞争层的内星权向量,第二阶段采用有导师的Widrow-Hoff规则(最小均方规则LMS)来训练竞争层的外星权向量。CPN算法步骤第一阶段采用竞争学习算法对输入层到竞争层的权向量进行训练。将内星权值随机赋予0~1上的值,归一化 阅读全文
posted @ 2012-07-14 11:24 张朝阳 阅读(3229) 评论(0) 推荐(0) 编辑
摘要: 在人的视网膜、脊髓中有一种现象,当一个神经细胞兴奋后,会对周围神经细胞产生抑制作用。极端情况下,不允许其他细胞兴奋,这就是上文提到的学习规则中的胜者为王。竞争学习算法分为3步:向量归一化输入的模式向量X和竞争层各细胞的内星权向量Wj(j-1,2,...,m)都是进行归一化。并且每次迭代都要进行归一化操作。寻找获胜神经元竞争层各细胞的内星权向量Wj(j-1,2,...,m)与输入向量X进行相似度比较,不论是用欧氏距离,还是夹角法,(由于X和W都已归一化,)得到的结论都是:与X点积最大的Wj对应的竞争层的细胞j中获胜者。网络输出权值调整获胜神经元的输出为1,其他细胞的输出为0。只有获胜细胞才可以调 阅读全文
posted @ 2012-07-13 18:44 张朝阳 阅读(10476) 评论(0) 推荐(2) 编辑
摘要: 神经元的变换函数从净输入到输出的变换函数称为神经元的变换函数,即阈值型变换函数比如符号函数非线性变换函数比如单极性Sigmoid函数又比如双极性S型(又曲正切)函数分段性变换函数比如概率型变换函数这时输入与输出之间的关系是不确定的,需要用一个随机函数来描述输出状态为1或为0的概率。设输出为1的概率为T为温度参数,这种神经元模型也称为热力学模型。学习规则改变权值的规则称为学习规则或学习算法。学习规则权值调整权值初始化学习方式变换函数向量式元素式Hebbian0附近的小随机数无导师任意离散Percrptron任意有导师二进制连续感知器δ规则任意有导师连续最小均方LMS(Widrow-Hoff规则) 阅读全文
posted @ 2012-07-12 22:38 张朝阳 阅读(8263) 评论(4) 推荐(0) 编辑
摘要: 先上问题吧,我们统计了14天的气象数据(指标包括outlook,temperature,humidity,windy),并已知这些天气是否打球(play)。如果给出新一天的气象指标数据:sunny,cool,high,TRUE,判断一下会不会去打球。table 1outlooktemperaturehumiditywindyplaysunnyhothighFALSEnosunnyhothighTRUEnoovercasthothighFALSEyesrainymildhighFALSEyesrainycoolnormalFALSEyesrainycoolnormalTRUEnoovercast 阅读全文
posted @ 2012-07-11 17:20 张朝阳 阅读(20849) 评论(5) 推荐(4) 编辑
摘要: 鉴于矩阵的奇异值分解SVD在工程领域的广泛应用(如数据压缩、噪声去除、数值分析等等,包括在NLP领域的潜在语义索引LSI核心操作也是SVD),今天就详细介绍一种SVD的实现方法--Jacobi旋转法。跟其它SVD算法相比,Jacobi法精度高,虽然速度慢,但容易并行实现。 一些链接 http://c 阅读全文
posted @ 2012-07-06 15:44 张朝阳 阅读(22198) 评论(1) 推荐(3) 编辑
摘要: 模型的建立一句话中出现的汉字构成观察序列,如“希腊的经济结构较特殊”对应的观察序列O={希,腊,的,经,济,结,构,较,特,殊}。所有观察值的集合至少应该包含训练集和测试集中出现的所有汉字。状态有4种:B表示词首的汉字;M表示词语中间的汉字;E表示词尾的汉字;S表示单独的汉字构成一个词。举例:希/B腊/E 的/S 经/B济/M结/M构/E 较/S 特/B殊/E文本的预处理语料库用的是使用msr_training.utf8和msr_test.utf8由于要做分词,我们的观察值是一个一个的汉字,从文本中提前汉字的方法自然是一次读取3个字节。如果文本中含有英文符号、英文字母、阿拉伯数字等对会... 阅读全文
posted @ 2012-06-30 16:51 张朝阳 阅读(5932) 评论(4) 推荐(0) 编辑
摘要: 手头的语料库依然是msr_training.utf8和msr_test.utf8,它来自于自于SIGHAN Bakeoff 2005的 icwb2-data.rar1.rmspace.cpp研究院的训练文档是已经分好词,但我们并不需要这个结果,我们要使用计算所有分词系统重新进行分词并进行词性标注,所以第一步要把训练文档中行内的空格去掉。#include<iostream>#include<fstream>#include<sstream>#include<string>using namespace std;int main(int argc,c 阅读全文
posted @ 2012-06-28 14:54 张朝阳 阅读(6315) 评论(5) 推荐(0) 编辑
摘要: 如果不要求“原地”,正向遍历原链表,头插法建立一个新的单向链表,它就是原链表的逆序。下面利用递归的方法将单向链表原地逆序。#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct node{ int data; struct node *next;}NODE;void insert(NODE **head,NODE *node){ if((*head)==NULL){ *head=node; (*head)->next=NULL; }else{ //头... 阅读全文
posted @ 2012-06-09 17:49 张朝阳 阅读(4359) 评论(0) 推荐(0) 编辑
摘要: 杂记 ZooKeeper的用途:distributed coordination;maintaining configuration information, naming, providing distributed synchronization, and providing group ser 阅读全文
posted @ 2012-06-05 09:56 张朝阳 阅读(31460) 评论(1) 推荐(2) 编辑
摘要: 使用JMeter做压力测试1.下载Jmeter地址:http://jmeter.apache.org/download_jmeter.cgi2.启动jmeter运行bin/jmeter.bat3.添加线程组在TestPlan节点上右键,Add-->Threads(Users)-->ThreadGroup。NumberofThreads(Users):要模拟的并发用户量。RampUpPeriod(inseconds):在多长时间内均匀启动所有的线程。比如NumberofThreads设为10,RampUpPeriod设为1,则jmeter每隔0.1秒启动1个线程。LoopCount: 阅读全文
posted @ 2012-06-01 14:35 张朝阳 阅读(50831) 评论(0) 推荐(2) 编辑
摘要: 首先去《知网》的官方网站上下载WordSimilarity.rar,解压后有两个文件是我们需要的:whole.dat和glossary.dat,关于那个《基于知网的词汇语义相似度计算.doc》建议不要看,那是个老版本的,写的不清楚,可以去这里看Final版(刘群等著),本博客就是按照这个版本来计算词 阅读全文
posted @ 2012-03-11 20:09 张朝阳 阅读(6172) 评论(3) 推荐(2) 编辑
摘要: 本文只粘代码,理论方法请参见《基于语义的中文文本关键词提取算法》。 文本预处理部分 1.对于原始文档,我们要求是中文(包括标点符号),并且文档的一第句(即第一个全角句号之前的内容)应该是文章的标题。 2.采ISCTCLAS分词,并标注词性。 wordseg.cpp 注意编译时要指明头文件和动态库的路 阅读全文
posted @ 2012-03-04 16:08 张朝阳 阅读(33487) 评论(10) 推荐(1) 编辑
摘要: 我在ubuntu是需要先安装GDBM的。总结一下GDBM的特点:按key-value存储数据,value是可变长的。它只对key进行索引,只能按key进行查询。高效的查询,低效的插入,适合于存储比较静态的数据。GDBM可以很容易地编译进一个可发布的二进制文件中,不需要独立地安装数据库服务器。不支持SQL,不支持表之间创建关系,更不用说存储过程、触发器什么的了。操作GDBM就跟操作文件很相似,下面的代码用于创建一个数据库,并存入一条记录。#include<gdbm.h>#include<stdlib.h>#include<stdio.h>#include< 阅读全文
posted @ 2012-02-25 15:06 张朝阳 阅读(9741) 评论(1) 推荐(0) 编辑
摘要: 先提供几个链接PairingHeap算法讲得不错PairingHeap的C语言实现BinaryHeap, FibHeap, PairHeap对改进Dijkstra的性能比较Dijkstra的计算过程就是在维护一张表,形如:vknowndpv1T00v2F2v1v3F3v4v4T1v1v5F3v4v6F9v4v7F5v4每一次循环要从d中找出最小者,于是PairHeap、FibHeap、BinaryHeap等等就派上用场了。本文我们采用PariHeap,至于为什么请看链接3。当需要更改(减小)d的值时,需要从PairHeap上找到相应的节点再执行DecreaseKey操作,于是我在链接2的基础之 阅读全文
posted @ 2012-02-24 16:03 张朝阳 阅读(2246) 评论(0) 推荐(0) 编辑
摘要: 根据文件名的后缀,判断是不是图片char *Pic_list[]={"jpg","bmp","png",NULL};int isPic(char *name){ char **listwalk; int len; for (listwalk = Pic_list; *listwalk; listwalk++) { len = strlen(*listwalk); if (strlen(name) > len && !strcasecmp(name + strlen(name) - len, *listwalk)) 阅读全文
posted @ 2012-02-23 16:55 张朝阳 阅读(1269) 评论(0) 推荐(2) 编辑
摘要: 我下载的是TanCorp-12预处理格式step1.编码转换刚下载下来的语料库编码是cp936即gb2312,所以下先转换成utf-8编码。转码工作在windows下进行,用到一个工具iconv.exe.iconv*.txt -p E:\\TanCorp-12-Txt -f gb2312 -t utf-8 -v -sstep2.去掉文件的前3个字节utf-8格式一个汉字是3个字节。Windows下记事本在保存utf-8文件时会在文件头加入3个字节:efbbbf--在上一步使用了iconv.exe后文开头也多出了这3个字节。在Linux下你可以用hexdump -C file查看文件的十六进制编 阅读全文
posted @ 2012-02-18 22:35 张朝阳 阅读(899) 评论(0) 推荐(0) 编辑
摘要: 方法1awk 'pattern { action }' awkvar1=shellvar1 awkvar2=shellvar2 ... input_filesawk_script_file awkvar1=shellvar1 awkvar2=shellvar2 ... input_files这要在pattern或action中就可以使用awkvar1、awkvar2了方法2#!/bin/bashname="Jack White"awk '$1~/"'"$name"'"/ {printf $1&q 阅读全文
posted @ 2012-02-17 09:04 张朝阳 阅读(888) 评论(0) 推荐(0) 编辑
摘要: 最近用C写了个爬虫,纯属练习,离实用还相差甚远。下载源码:ISeeSpiderbloom.h实现布隆过滤器算法。对一条url拆分为domain和path两部分,bloomDomain函数判断domain是否出现过,bloomPath函数判断path是否出现过。如果domain未出现过,则要先进行DNS解析(解析之后把domain和ip对存入map),再下载网页;如果domain出现过,则不需要再进行DNS解析,此时如果path也出现过,则该url直接忽略;如果是新的url,需要放入queue。建立好socket connection后向连接写入http request,然后把sockfd放入e 阅读全文
posted @ 2012-02-14 19:32 张朝阳 阅读(6177) 评论(7) 推荐(1) 编辑
摘要: main(){ char *p1="abcde"; //p1是main函数中的局部变量,存放在栈区;"abcde"是字符串常量,存放在数据区 char *p2=(char*)malloc(10); //p2存放在栈区;malloc来的10个字节位于堆区 char *p3=dup(p1); //dup背后调用了malloc p1[0]='w'; //错误,字符串常量不可修改 char *p4=index(p1,'d'); //p4指向了数据区中的"abcde"中的'd' p4='w 阅读全文
posted @ 2012-02-12 09:15 张朝阳 阅读(540) 评论(0) 推荐(0) 编辑
摘要: 实际上,GDB 没有对多进程程序调试提供直接支持。例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去。如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号并终止。那么该如何调试子进程呢?其实我们可以利用GDB的特点或者其他一些辅助手段来达到目的。此外,GDB 也在较新内核上加入一些多进程调试支持。本文介绍的方法能让你把断点设在子进程中,单步查看子进程的运行情况。但问题,如果我想在一次调试中同时在父子进程中设置断点,单步执行该怎么做呢? 1 #include<stdio.h> 2 #include<stri 阅读全文
posted @ 2012-01-09 21:08 张朝阳 阅读(4446) 评论(0) 推荐(0) 编辑
摘要: 首先明确一下,同一个文件在同一个进程中可以被打开多次,只是返回的文件描述符不同。read、write、lseek都涉及到文件指针,文件指针是跟文件描述符关联在一起,跟物理文件是分开的。每个文件描述符都有3个指针:begin、curr、end。可以有两种方法更改curr指针:每次write或read的末位置就是curr指针的位置;使用lseek(int fd,int offset,int whence)。每次read都从curr位置开始,每次write都从begin位置开始。看一段程序: 1 #include<stdio.h> 2 #include<string.h> 3 阅读全文
posted @ 2012-01-09 20:22 张朝阳 阅读(2620) 评论(0) 推荐(0) 编辑
摘要: 如果你对代码段、数据段、栈、堆存放哪些数据还不是很清楚,请先看我写和Linux 内存管理。有时会出现父子进程变量的地址一样,但值不一样。看下面代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>main(){ char str[4]="asd"; pid_t pid=fork(); if(pid==0){ str[0]='b'; printf("子进程中str=%s\n",str); printf 阅读全文
posted @ 2012-01-09 18:34 张朝阳 阅读(15675) 评论(5) 推荐(7) 编辑
摘要: 先来介绍valgrind和examine这两个工具的使用。使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:x/<n/f/u> <addr>n、f、u是可选的参数。n 是一个正整数,表示显示内存的长度。f 表示显示的格式,其取值如下:x 按十六进制格式显示变量d 十进制u 十六进制无符号整型o 八进制t 二进制c 字符s 字符串f 浮点数i 指令u 表示从当前地址往后请求的字节数,其取值如下:b表示单字节h表示双字节w表示四字 节(默认)g表示八字节Valgrind 可以对编译后的二进制程序进行内存使用监测(C语言中的malloc和free, 阅读全文
posted @ 2012-01-07 18:27 张朝阳 阅读(10005) 评论(0) 推荐(0) 编辑
摘要: 第一个性能当然是速度,还有两个:延时:完成指定工作所需要的时间吞吐率:单位时间内完成的工作量开发并行性通常能改进吞吐率。开发并行可以隐藏延时,当然并没有真正的减少延时,只是隐藏了延时的代价,因为它“与其等待,不如去计算其余部分”。并行计算比串行计算要建立更多线程而带来额外开销,建立进程的开销远大于线程,这是因为存储器的分配和初始化非常昂贵。线程(或进程)间的通信是开销的主要部分。存储器的带宽也限制了并行计算的速度,比如当CPU读DRAM时可能出现延时(当要加载的数据量很大,cache容不下时,CPU就不得不读取DRAM)。存储器带宽约束不多核计算中的特别问题,这通常受限于芯片的边界。避免过早的 阅读全文
posted @ 2012-01-04 10:03 张朝阳 阅读(1876) 评论(0) 推荐(0) 编辑
摘要: 现在一个芯片上可以构造多指令的执行引擎,俗称核。cache一般分三级,L1、L2、L3,L1离CPU最近,容量最小。Intel Core Duo处理器中,每个处理器各有一个32KB的私有1级指令cache和数据cache,它们共享一个2M的2级cache。cache一致性保证仅在处理器单独使用cache行的情况下,处理器才可以写入私有的高速缓存行单元----这样多处理器就引入了额外的开销。其次,当两个处理器处理同一问题时,它们对处理器带宽的要求是单个处理器需求的两倍,这意味着要把CPU的周长做长,以接入更多的I/O引脚,主要的节省来自于共享指令。AMD的Dual Core Operation芯 阅读全文
posted @ 2012-01-03 19:05 张朝阳 阅读(362) 评论(0) 推荐(0) 编辑
摘要: 要统计一个整型数组中3出现的次数,写一个并行程序:#include<time.h>#include<assert.h>#include<stdlib.h>#include<stdio.h>#include<string.h>#include<sys/types.h>#include<pthread.h>#define ARRLEN 200000000 //int型数组的长度,我们的程序就是要统计这个数组中元素3出现了多少次struct padded_int{ int value; //4个字节 char pad 阅读全文
posted @ 2012-01-03 16:57 张朝阳 阅读(2718) 评论(3) 推荐(0) 编辑
摘要: 安装IIS控制面板->程序->程序和功能, 点击左侧的“打开或关闭Windows功能”把这几项都勾上吧,虽然有些不是必须的,多勾无碍。进入IIS管理器控制面板-> 系统和安全->管理工具->IIS管理器添加新网站在左侧栏中,右键“网站”->添加网站随便输入个网站名。此时会创建一个同名的应用程序池。点击“连接为”,选择特定用户,设置凭据,输入本地电脑上的用户名和密码。端口不要再用80了,因为80已经给那个default website用了。特别强调:主机名不要填,否则就只能通过主机名而不能通过IP访问了(即使在本地用127.0.0.1:8090都不能访问).编 阅读全文
posted @ 2012-01-01 11:08 张朝阳 阅读(91288) 评论(14) 推荐(16) 编辑
摘要: 使用curses库可以设置光标的位置和终端屏幕上显示的字符串样式。下面是一个使用curses库的简单示例:#include<stdio.h>#include<curses.h>void main(){ initscr(); //初始化curses库和tty clear(); //清屏 int i; for(i=0;i<LINES;i++){ move(i,i+1); //把光标移到(10,20)的位置 if(i%2==1) standout();//启动standout模式,一般使屏幕反色 adds... 阅读全文
posted @ 2011-12-26 16:52 张朝阳 阅读(856) 评论(0) 推荐(0) 编辑
摘要: java中有wait()、notify()、notifyall(),Linux C中有一组函数和它们是一一对应的,实现完全相同的功能。int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);int pthread_cond_signal(pthread_cond_t * cond);int pthread_cond_broadcast(pthread_cond_t * cond);要实现java中的synchonized,在Linux C中可以使用:pthread_mutex_lock(pthread_mutex.. 阅读全文
posted @ 2011-12-26 14:52 张朝阳 阅读(3367) 评论(0) 推荐(0) 编辑
摘要: 创建线程比创建进程快10~100倍。#include<pthread.h>int pthread_create(pthread_t *thread, pthread_attr_t *attr, //线程的属性 void *(*func)(void *), //指向线程所运行的函数的指针 void *arg); //func函数的参数void pthread_exit(void *status) 以状态status退出int pthread_join(pthread_t thread, void **retva) retv... 阅读全文
posted @ 2011-12-25 19:51 张朝阳 阅读(566) 评论(0) 推荐(0) 编辑
摘要: 进程和进程之间无非是通过磁盘、内核、用户空间传输数据。通过磁盘(也就是文件)实现进程通信这个好理解,服务器进程把计算结果写入文件,客户端进程从文件读数据就可以了。这里的竞争条件是当服务端正在写文件时,客户端是不允许读的。命名管道把数据写入文件,因此它可以独立于进程存在。但是命名管道是一个队列而非常规的文件,当读者把数据读走后,数据就不存在了,下一次读到的是后面的内容。普通管道位于内核,用于父子进程间通信,因此它的存在依赖于进程的存在。进程间通过文件或FIFO传输数据时,write将数据从内存复制到内核缓冲区,read将数据从内核缓冲区复制到内存。而使用共享内存是不存在用户空间和内核空间的来回复 阅读全文
posted @ 2011-12-25 19:48 张朝阳 阅读(2302) 评论(0) 推荐(1) 编辑
摘要: popen:让进程看起来像文件#include<stdio.h>#include<stdlib.h>int main(){ FILE *fp; char buf[100]; int i=0; fp=popen("who|sort","r"); //打开一个命令,因为是只读"r",所以是要读取命令的输出 while(fgets(buf,100,fp)!=NULL) printf("%3d %s",i++,buf); pclose(fp); return 0;}$ gcc popendemo.c 阅读全文
posted @ 2011-12-25 09:43 张朝阳 阅读(614) 评论(0) 推荐(0) 编辑