最近刚开始接触
Linux,在虚拟机中装了个
Ubuntu,当前的版本是
Ubuntu 11.10,装好后自然少不了安装一些软件,在设置了软件的源后,就开始了 sudo apt-get install,结果出现了下面的Unable to locate package错误:
- letuknowit@ubuntu:~$ sudo apt-get install mysql-server mysql-client
- [sudo] password for letuknowit:
- Reading package lists… Done
- Building dependency tree
- Reading state information… Done
- E: Unable to locate package mysql-server
- E: Unable to locate package mysql-client
- letuknowit@ubuntu:~$
这叫一个郁闷啊,出师不利,不带这么吓唬刚玩Ubuntu的小朋友吧~于是赶紧找资料,又回顾下前面的操作,最后发现问题出在执行sudo apt-get install之前更换了软件源,但是却忘了update下了,于是执行下面的命令:
等上面命令执行完后,再执行sudo apt-get install就可以了!其实错误信息已经很明确了,Unable to locate packet就是无法找到包嘛,那还不赶紧sudo apt-get update下!
make是一个命令工具,是一个解释makefile中指令的命令工具。
一般来说每一个源文件都会对应一个中间目标文件。
编译(compile)生成中间目标文件,连接(link)生成可执行文件,连接主要是连接函数和变量。链接器不管源文件,只管中间目标文件。函数如果未被声明可以生成中间目标文件,但是连接时候会报错。
make命令执行时候需要一个makefile文件,以告诉make命令需要怎么样去编译和连接程序。我们需要一个makefile来告诉make命令如何编译个连接。规则是:
1)如果这个工程没有被编译过,那么我们所有的c文件都要被编译并且被连接
2)如果这个工程中间的几个c文件被修改,那么我们只需要编译被修改的c文件,并且连接目标程序
3)如果这个工程的头文件被修改,那么需要编译引用这个头文件的c文件。并且连接目标文件。
makefile的规则:
targe...: prerequisites...
command
...
...
;target就是一个目标文件,可以是一个obj文件,也可以是可执行文件,还可以是一个标签(label)。
;prerequisites就是要生成那个target所需要的文件或者是目标。
;command也就是make要执行的命令。(任意的shell命令)
依赖关系实质上说明了目标文件是由哪些文件生成的,换言之,目标文件是由哪些文件更新的。在定义好依赖关系以后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要一个tab键开头。
在默认的方式下,我们只是输入了make命令,那么make是如何工作的呢?
1)make会在当前目录下寻找名字叫“Makefile”或者“makefile”的文件
2)如果找到,它就会找文件中的第一个目标文件(target)。就是makefile文件中的第一个target。并且把这个文件作为最终的目标文件。
3)如果目标文件不存在,或者是目标所依赖后面的.o文件的修改时间要比target文件新,那么就会执行后面所定义的命令来生成目标文件
4)如果目标文件所依赖的.o文件也不存在,那么make就会在当前文件中间寻找.o文件的依赖型。生成.0文件
5)当然,c文件和h文件都是存在的啦。于是make会生成.o文件,然后再用.o文件生成make的终极任务,也就是最终的目标文件。
make的依赖型:make会一层一层的寻找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中如果出现错误,比如最后被依赖的文件没 有找到,那么make会直接推出,并且报错。对于所定义的命令的错误,或者是编译不成功,make根本不理睬。make只管文件的依赖型。
声明一个变量,叫objects,OBJECTS,objs,OBJS,obj,OBJ.在makefile中以“$(objects)”的方式来使用这个变量。
每一个makefile中都应该写一个清空目标文件(.o和执行文件)的规则。这不仅便于重新编译,而且有利于保持文件的清洁。clean从来就是放在文件的最后。
makefile里面有什么?主要包括五个东西:显式规则,隐晦规则,变量定义,文件指示和注释。
1)显式规则:要生成的文件,文件的依赖文件和生成的命令。
2)隐晦规则:make有自动推导的功能,能够推导出依赖关系。
3)变量的定义:makefile中要定义一系列的变量,变量一般都是字符串。
4)文件指示:包括三部分:
A)一个makefile引用另一个makefile,类似于c中的“include”。使用include关键字将别的makefile包含进来。语法:include<filename>
B)根据某些情况指定makefile中的有效部分,类似于c中的“#if”
C)多行命令
5)注释:行注释“#”,用“\#”进行转义。
make一次寻找“GNUmakefile”,“makefile”,“Makefile”。
伪目标并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成他的依赖关系和决定它是否要执行。为了避免伪目标和文件重名,使用特殊的标记“.PHONY”来显式的表示是“伪目标”。
///////////////////////////////////////////////////////////////
Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计 算机系统;多任务是指Linux可以同时执行几个任务,
它可以在还未执行完一个任务时又 执行另一项任务。 操作系统管理多个用户的请求和多个任务。大多数系统都只有一个CPU和一个主存,
但一个系统可能有多个二级存储磁盘和多个输入/输出设备。操作系统管理这些资源并在 多个用户间共享资源,当您提出一个请求时,给您造成一种假象,
好象系统只被您独自占 用。而实际上操作系统监控着一个等待执行的任务队列,这些任务包括用户作业、操作系 统任务、邮件和打印作业等。
操作系统根据每个任务的优先级为每个任务分配合适的时间 片,每个时间片大约都有零点几秒,虽然看起来很短,但实际上已经足够计算机完成成千
上万的指令集。每个任务都会被系统运行一段时间,然后挂起,系统转而处理其他任务; 过一段时间以后再回来处理这个任务,直到某个任务完成,
从任务队列中去除。 Linux系统上所有运行的东西都可以称之为一个进程。每个用户任务、每个系统管理 守护进程,都可以称之为进程。
Linux用分时管理方法使所有的任务共同分享系统资源。 我们讨论进程的时候,不会去关心这些进程究竟是如何分配的,或者是内核如何管理分配
时间片的,我们所关心的是如何去控制这些进程,让它们能够很好地为用户服务。 进程的一个比较正式的定义是:在自身的虚拟地址空间运行的一个
单独的程序。进 程与程序是有区别的,进程不是程序,虽然它由程序产生。程序只是一个静态的指令集合 ,不占系统的运行资源;而进程是一个随时都
可能发生变化的、动态的、使用系统运行资 源的程序。而且一个程序可以启动多个进程。 Linux操作系统包括三种不同类型的进程,每种进程都有自己
的特点和属性。 交互进程——由一个shell启动的进程。交互进程既可以在前台运行,也可以在后台运行 批处理进程——这种进程和终端没有联系,
是一个进程序列 监控进程(也称守护进程)——Linux系统启动时启动的进程,并在后台运行。 上述三种进程各有各的作用,使用场合也有所
不同。 进程和作业的概念也有区别。一个正在执行的进程称为一个作业,而且作业可以包 含一个或多个进程,尤其是当使用了管道和重定向命令。
例如“nroff -man ps.1|grep kill|more”这个作业就同时启动了三个进程。 作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个
进程,等一 会儿再继续执行该进程。shell将记录所有启动的进程情况,在每个进程过程中,用户可 以任意地挂起进程或重新启动进程。作业控制是许
多shell(包括bash和tcsh)的一个特 性,使用户能在多个独立作业间进行切换。 一般而言,进程与作业控制相关联时,才被称为作业。
在大多数情况下,用户在同一时间只运行一个作业,即它们最后向shell键入的命令 。但是使用作业控制,用户可以同时运行多个作业,并在需要时在
这些作业间进行切换。 这会有什么用途呢?例如,当用户编辑一个文本文件,并需要中止编辑做其他事情时,利 用作业控制,用户可以让编辑器暂
时挂起,返回shell提示符开始做其他的事情。其他事 情做完以后,用户可以重新启动挂起的编辑器,返回到刚才中止的地方,就象用户从来没 有离开
编辑器一样。这只是一个例子,作业控制还有许多其他实际的用途。
程序大体是这样的:
一个入口, 然后初始化一些数据,然后进入一个循环不停地处理事件。这个事件可能是操作界面所触发,可能是网络数据所触发
1.memmove
函数原型:void *memmove(void *dest, const void *source, size_t count)
返回值说明:返回指向dest的void *指针
参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数
函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。
2.memcpy
函数原型:void *memcpy(void *dest, const void *source, size_t count);
返回值说明:返回指向dest的void *指针
函数说明:memcpy功能和memmove相同,但是memcpy中dest和source中的区域不能重叠,否则会出现未知结果。
3.两者区别
函数memcpy() 从source 指向的区域向dest指向的区域复制count个字符,如果两数组重叠,不定义该函数的行为。
而memmove(),如果两函数重叠,赋值仍正确进行。
memcpy函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用memcpy;
如果你不能保证是否有重叠,为了确保复制的正确性,你必须用memmove。
memcpy的效率会比memmove高一些,如果还不明白的话可以看一些两者的实现:
void *memmove(void *dest, const void *source, size_t count)
{
assert((NULL != dest) && (NULL != source));
char *tmp_source, *tmp_dest;
tmp_source = (char *)source;
tmp_dest = (char *)dest;
if((dest + count<source) || (source + count) <dest))
{// 如果没有重叠区域
while(count--)
*tmp_dest++ = *tmp_source++;
}
else
{ //如果有重叠
tmp_source += count - 1;
tmp_dest += count - 1;
while(count--)
*--tmp_dest = *--tmp;
}
return dest;
}
void *memcpy(void *dest, const void *source, size_t count)
{
assert((NULL != dest) && (NULL != source));
char *tmp_dest = (char *)dest;
char *tmp_source = (char *)source;
while(count --)//不对是否存在重叠区域进行判断
*tmp_dest ++ = *tmp_source ++;
return dest;
}
http://www.rosoo.net/a/201002/8563.html
// my_class.h
template<typename T>
class my_class
{
void foo();
}
// my_class.cpp
template<typename T>
void my_class<T>::foo()
{
}
// 如果成员函数的实现不是放在h文件里,那么引用模板的地方也要包含cpp文件
// main.cpp
#include "my_class.h"
#include "my_class.cpp"
int main(int argv, char* argc[])
{
my_class<int> c;
}
http://www.ningoo.net/html/2008/how_to_run_processes_on_background_in_linux.html
1/
按ctrl+alt+f1...7切换, 1-6为命令窗口,7为xwindow, 参考"鸟哥私房菜"p115
注意ctrl+alt与vwmare的按建冲突
2/
在tty1下登陆 login incorrect错误, 这是一个bug, 需要把小键盘的 numlock 关掉再输出密码
3/
there are stopped jobs 见我的同名博文
4/
GCC 有超过100个的编译选项可用. 这些选项中的许多你可能永远都不会用到, 但一些主要的选项将会频繁用到. 很多的 GCC 选项包括一个以上的字符. 因此你必须为每个选项指定各自的连字符, 并且就象大多数 Linux 命令一样你不能在一个单独的连字符后跟一组选项. 例如, 下面的两个命令是不同的:
gcc -p -g test.c
gcc -pg test.c
第一条命令告诉 GCC 编译 test.c 时为 prof 命令建立剖析(profile)信息并且把调试信息加入到可执行的文件里. 第二条命令只告诉 GCC 为 gprof 命令建立剖析信息.