grep 用法简述

于 2012年03月16日 发布在 linux应用 一条评论 »

grep( global search regular expression(RE) and print out the line)是一个在文本中搜索模式并且把有匹配文本的行输出出来的工具,使用的前提是要知道一下正则表达式相关的知识。grep命令的基本格式如下

grep -选项 ‘搜索字符串’ 文件

当我们不加‘文件’参数的时候,grep默认从标准输入读入。每处理一行,如果能搜索到匹配模式的,就将整行输出出来。如果有很多文件,那么搜索到一行,将会在行前面加上文件名前缀。比如搜索当前文件夹下所有文件下有那些行包含‘fcntl‘ ,那么就用 grep ’fcntl‘ *。

不同的选项有不同的效果:

-c 输出匹配的行的数目
-i 忽略搜索串中的字母大小写
-n 输出行号
-v 反向选择,输出不满足要求的行
-a 在二进制文件中查找
-r 递归搜索子文件夹中的文件
-E 使用扩展正则表达式进行匹配, egrep 相当于 grep -E
-Hh h显示文件名前缀,H不显示。默认显示。
-A n 显示匹配行之后n行(After)
-B n 显示匹配行开始到之前n行(Before)
-C n 相当于-A n -B n = =||
-d recurse|read|skip recurse表示递归处理子目录(-d recurse先当于 -r),skip表示忽略,read表示把目录做成一般文件

grep包含的工具还有egre 阅读全文 »

GCC编译流程与常用选项

于 2012年03月14日 发布在 linux应用 没有评论 »

学了很长时间的c和c++,对于gcc的用法还不是很清楚,只会用“gcc a.c -o a”这类的命令。至于预处理,编译,汇编,链接等过程不是十分清楚。前两天到图书馆借了本快速入门的书,学习了下,现在做个小小的总结。

编译的基本流程:

c(.c)和c++(.cc, .cpp, .cxx)的源文件 。

|| gcc -E a.c -o a.i // 如果不加-o参数,gcc会把处理过的源文件放到标准输出中

预处理后的源文件。c源文件预处理后后缀为.i, c++为.ii 。

|| gcc -S a.i //会在当前文件夹下生成a.s

编译后生成的汇编源代码。后缀为.s, .S 。

|| gcc -c a.s //只进行汇编生成目标文件,.o结尾的目标文件可以用(ar crv libabc.a a.o b.o c.o )打包成形如lib×××.a的静态库

目标文件与库文件进行链接,生成可执行文件。

||gcc  a.o //在当前文件夹下生成a.out

基本的过程就是以上四步。其中任何一种状态,用gcc如果不加-c,-E,-S选项都会直接生成可执行文件,如果加上了选项,可以由之前任一状态生成所需要的文件(如gcc -S a.c 可以直接生成a.s,gcc -c a.i可以直接生成a.o )。如果是c++直接换用g++命令就行。

另外gcc -v可以输出编译过程的配置和版本信息。

gcc警告提示: 阅读全文 »

一个简单的vector实现

于 2012年03月13日 发布在 算法&&ACM 2 条评论 »

学算法用的是《数据结构与算法分析(c++描述)》,里面有用c++实现算法和数据结构的,我看了看感觉不错,就把敲了出来。
ps:不是我写的,,基本是照抄的,不过倒是学到不少东西。

vector的特点就是可以动态的改变数组的大小,一般的vector应该是容量不够的时候扩展到2倍的容量,微软的实现应该是不够的时候扩展到1.5倍容量.
阅读全文 »

一个简单的list实现

于 2012年03月9日 发布在 算法&&ACM 没有评论 »

此List仿照的时STL中的list 写的,完成了一些基本功能。学习时候时按照书上(数据结构与算法分析,c++描述)学习的,了解到了迭代器的基本实现,感觉很有成就感。List用双向链表实现的,这样就可以方便地对迭代器应用++,–操作符。链表中又添加了两个节点tail和head,这样在插入删除元素的时候在操作上就统一了。

虽然说写出来了,而且经过简单的测试,没有啥问题(当然,我没有做任何的错误处理。。),但是感觉这种接口与实现分离的写法实在是太麻烦了。以后考虑把这些接口都放到注释中去,然后再在实际代码中实现,这样就不用去写一堆的template<typename Object>了。

前两天学习了git的用法,准备把自己的代码放到github上面,repo名称为fkcode。有兴趣的可以watch me。放代码~

#include<iostream>
template<typename Object>
class List{
private:
	struct Node;	//存放节点信息
	int theSize;	//List包含的元素的个数
	Node *head,*tail; //当容器为空的时候,有两个节点

	void init();
public:
	class const_iterator; //const迭带器
	class iterator;			//迭带器

	List();//constructor
	List( const List & rhs );
	~List();
	const List & operator= (const List & rhs );
	//the "Big Three"

	//basic routines, easy to understand by name
	iterator begin();
	iterator end();
	const_iterator begin() const;
	const_iterator end() const;

	int size() const;
	bool empty() const;
	void clear();

	Object & front();
	Object & back();
	const Object & front() const;
	const Object & back()  const;

	void push_front( const Object & x );
	void push_back(  const Object & x );
	void pop_front();
	void pop_back();

	iterator insert( iterator itr, const Object & x );
	iterator erase( iterator itr );
	iterator erase( iterator start, iterator end );

};

阅读全文 »

标准I/O库之缓冲

于 2012年03月4日 发布在 linux应用 3 条评论 »

标准io提供缓冲的目的是尽可能减少read和write的调用。他对每个流进行缓冲管理,减少了编码的复杂度。标准IO库提供了三种类型的缓冲。

1.全缓冲。当缓冲区填满之后才进行实习操作,驻留在磁盘上的文件通常都是全缓冲的。在第一个流上执行第一次io操作时,相关函数用malloc获得所需的缓冲区。

2.行缓冲。在输入和输出中遇到换行符的时候,标准库执行IO操作。当流涉及到一个终端的时候,通常使用行缓冲。

3.不带缓冲。标准IO库不对字符进行缓冲储存,stderr通常时不带缓冲的,这就可以使出错信息可以尽快显示出来。

当且仅当标准输入和标准输出并不涉及互交式设备时候,流才是全缓冲的。

标准出错输出不会是全缓冲的。

可以用setbuf,setvbuf更改流的缓冲类型。

下面有个程序很好的解释了以上:
阅读全文 »

APUE 文件和目录 几个小知识点

于 2012年03月3日 发布在 linux应用 没有评论 »

如果用open或creat创建已经存在的文件,则该文件的访问权限位不变。

文件中的空洞是由所设置的偏移量超过文件的尾端,并写了某些数据造成的。空洞不占用磁盘空间,只是打开文件时在内核用一个值为0的数据结构表示。相同长度的文件,含有空洞的文件占用的磁盘块(du  <文件>)可能少一些,用这可以大致判断一个文件是否有空洞。

int unlink( const char *pathname )函数删除目录项,并将由pathname所引用文件的链接技术 -1,如果还有指向该文件的其他链接,则仍然可以通过其他链接访问该文件的数据。只有当链接计数达到0时,该文件的内容才会删除。另一个条件也会阻止删除文件的内容—-只要有进程打开了该文件,其内容也不能删除。如果pathname是符号链接,那么unlink删除符号链接,而不会删除由该链接所引用的文件。给出符号链接的情况下,没有一个函数能删除由该链接所引用的文件。

我们也可以用remove函数删除对一个文件活目录的链接,对于文件,remove的用能与unlink相同,对于目录,remove的功能与rmdir相同。

内核对目录树的深度没有内在限制,但是如果路径名的长度超过了PATH_MAX,则有许多命令会失败。

stat结构中st_atime,st_mtime,st_ctime分别是文件数据的最后访问时间,文件数据的最后修改时间,i节点状态的最后更改时间。

父目录中的每一个子目录都会使该父目录的链接计数增1.

APUE 文件I/O 小结

于 2012年02月24日 发布在 linux应用 一条评论 »

手头有本《Unix环境高级编程 (APUE) 》,就在慢慢看,这两天把文件I/O看了看,现在总结一下。

这一章主要介绍的是非缓冲I/O(unbuffered I/O) ,表示每个read,write操作都进行一次系统调用,他不是标准C的一部分,是POSIX.1single UNIX Specification的一部分。知识点有一下几个部分。

文件描述符:内核向进程返回的一个非负整数,读写文件或进行相关操作的时候用他来标识文件。标准输入0,标准输出1,标准错误输出2分别由符号常量STDIN_FINLENO,STDOUT_FILENO,STDERR_FILENO表示。文件描述符一般选择未用的最小数,不超过OPEN_MAX(大多为63).

open函数:

#include<fcntl.h>

int open( const char * filename, int flag, ../* mode_t */ );

出错时候返回-1,成功返回文件描述符

flag可以是读(O_RDONLY),写(O_WRONLY),读写(O_RDWR),注意着三者不能用|来合并。还有一些可选的常量,比如,O_APPEND表示每次写都添加到文件末尾,O_CREAT创建文件时候要指定第三个参数文件权限,O_TRUNC打开文件时候清空。

lseek函数:

#include<unistd.h>

off_t lseek( int fd, off_t offset, int whence ) ;

成功时候返回偏移量,否则返回-1,虽然说off_t可以为负值,但是返回的时候的意义是相对于文件文件开头(SEEK_SET)的。

whence有三种(SEEK_SET, SEEK_CUR,SEEK_END),分别是相对于文件开始,当前偏移量,和文件结尾。当用lseek确定好要操作的文件位置之后,就能在返回的偏移位置上进行读写了。如果文件描述的是一个管道,FIFO或者网络套接字,则lseek返回-1,并将errno设置为ESPIPE。
阅读全文 »

寒假已去,说说近来

于 2012年02月20日 发布在 吐槽 11 条评论 »

寒假在家,木有网,不过是看了不少书。自从区预赛回来,就没有再看过算法没再刷过题,重心转移到了学习其他的知识上面了。

有很多人问我是考研,保研,还是工作,我一般的回答都还是不知道,有时候也是敷衍下。其实我心里是也没有咬定是哪个方向。一步一步走着看,这学期可以试试申请腾讯百度等的暑期实习项目,如果申请上了,那么必将会有很大的收获,也可能会有拿转正offer的机会,如果申请不上,我可以用暑假的时间准备考研(同时也可以学学其他的东西)。对于保研,貌似有那么一点点希望,到九月排名有了再说。校园招聘什么的也是会去试试的,成与败就又是一番景象了。前途未卜,不如着眼今朝。

寒假之前给自己制定了一个计划,两件事:1.粗略看完《C++ Primer(第四版)》,将以前不熟悉的名词术语搞清楚,对c++的知识构架有一个清晰的了解。2.看完《linux程序设计(第四版)》,对linux编程的知识结构也要建立清晰的认识。现在看来也算是完成了吧,满意度80%。我这样做就是对自己将要深入的知识做了个简单的哈希,方便以后深入学习时候查找,另一方面这样也减少了我的畏惧感(比如碰到函数fork,以前的话我不认识它我可能很担心,“我怎么还有这么多不会”,现在的话,我会想,“这个我见过,在进程控制那一部分,我将会在两周后学习到它”等等。。。恩)。当然,好奇心也是我的一个强大的驱动力。我的学习内容主要是3个方面:linux(使用及系统编程),c++,算法。为此制定了一下的新学期的几个任务:

1、重读C++Primer。把课后习题都敲敲。(两年前的今天,我坐在市里的图书馆,落地窗旁,左一本谭浩强的C,右一个笔记本,把课后习题都写了一遍,花了不到一个月,学了C。不知道现在看C++,能否有当初的心劲儿。)

2、完成一次LFS的建立。来学校前打印了文档,现在已经进行到第六章,也是比较重要的一章。目前还没有什么问题。目测将会学到不少东西,完成后来个总结,有兴趣的同学可以Q我,相互交流下。至于BLFS,CLFS等等能不能进行,到时候再说。

3、读懂 Boa的源码,boa是个简单的Http server,源码大概1万行(?),不会造成太大的心里压力。不能总是看函数,记记API吧,看一些实际的东西,应该启发更大些。重点应该是网络编程,进程通信什么的吧。

4、《数据结构与算法分析–C++描述》看了又一半了,看CP的时候利用所学的知识。把学到的数据结构,算法认真的实现一遍,自己尽量设计。我也会在这个blog上放出代码,路过的大牛如果愿意指出错误或者不合理,感激不尽~

就这些吧,不再加了。看看不是很重,但是也不轻。@小媛在努力,共勉啦~

明天就要上课了,突然发现我们教室几乎全部都在北教学区,这样就可以顺理成章的跟妹子去菊园吃饭了,也顺理成章晚上上上自习什么的,ds在学校的时间也就剩100天左右了,尽量多花时间陪陪她 (*^__^*) 嘻嘻……

早上又要起不来了。。。睡了~

linux编程初试

于 2011年11月30日 发布在 linux应用 6 条评论 »

今天的java项目搞了一个下午,后来发现是一个小问题纠结了很长时间,悲剧。

刚刚12点,睡不着,就练习下linux编程吧,前段时间买了本《linux程序设计》,感觉挺好的,就随便看看。

照着例题敲了下,顺便总结下:

例程在P104,扫描目录。

本程序的目的是扫描一个目录,并且把目录下的内容输出出来,主要操作在printdir函数内完成。

DIR是一个目录流结构体,在dirent.h头文件中声明,目录流指针(DIR *)被用来完成各种目录操作,其使用方法与普通文件流指针(
FILE *)很相似,目录数据项在dirent结构体中返回,用户不能更改DIR中的字段。dirent结构题中包括d_ino表示文件的inode节点号,表示文件名的name等等,其相应的操作有:

阅读全文 »

写了OJ判题的东东

于 2011年11月23日 发布在 编程语言 9 条评论 »

课程设计我们做OJ,具体来说应该是比赛平台。我的主要工作内容是clarification版块,处理用户提交和判题,判题这个东东学长写过,但是不打算用他的,准备自己写个,顺便练习下python。

这个代码参考了两个项目的代码,一个是 ONJ ,另一个是neuoj,ONJ是一个用php写的简单很漂亮的比赛平台,他的代码写的十分工整,推荐想学php和正在学php的读读他的源码,写的非常好,他的判题部分是用python写的,正是因为之前看过这个,所以才敢在课程设计上写。neuoj帮我改进了不少东西,有兴趣的也可以看看。

本来是想直接通过python把判题的结果直接放到数据库里面的,但是还要安装MySqldb库,不方便,就没动。。

只能运行载linux下了,里面的os.sep可以替换成’/’了。。之前是想载win上也能运行。java判题有待添加

阅读全文 »

第 5 页,共 10 页« 最新...34567...10...最旧 »