colorful

zc qq:1337220912

 

Linux新手入门:Unable to locate package错误解决办法

最近刚开始接触Linux,在虚拟机中装了个Ubuntu,当前的版本是Ubuntu 11.10,装好后自然少不了安装一些软件,在设置了软件的源后,就开始了 sudo apt-get install,结果出现了下面的Unable to locate package错误:
  1. letuknowit@ubuntu:~$ sudo apt-get install mysql-server mysql-client
  2. [sudo] password for letuknowit:
  3. Reading package lists… Done
  4. Building dependency tree    
  5. Reading state information… Done
  6. E: Unable to locate package mysql-server
  7. E: Unable to locate package mysql-client
  8. letuknowit@ubuntu:~$

  这叫一个郁闷啊,出师不利,不带这么吓唬刚玩Ubuntu的小朋友吧~于是赶紧找资料,又回顾下前面的操作,最后发现问题出在执行sudo apt-get install之前更换了软件源,但是却忘了update下了,于是执行下面的命令:

  1. sudo apt-get update

等上面命令执行完后,再执行sudo apt-get install就可以了!其实错误信息已经很明确了,Unable to locate packet就是无法找到包嘛,那还不赶紧sudo apt-get update下!

posted @ 2012-04-29 07:34 多彩人生 阅读(152839) | 评论 (5)编辑 收藏

make

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”来显式的表示是“伪目标”。


///////////////////////////////////////////////////////////////

posted @ 2012-04-26 23:53 多彩人生 阅读(300) | 评论 (0)编辑 收藏

linux 进程 和 作业

Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计 算机系统;多任务是指Linux可以同时执行几个任务,
它可以在还未执行完一个任务时又 执行另一项任务。    操作系统管理多个用户的请求和多个任务。大多数系统都只有一个CPU和一个主存,
但一个系统可能有多个二级存储磁盘和多个输入/输出设备。操作系统管理这些资源并在 多个用户间共享资源,当您提出一个请求时,给您造成一种假象,
好象系统只被您独自占 用。而实际上操作系统监控着一个等待执行的任务队列,这些任务包括用户作业、操作系 统任务、邮件和打印作业等。
操作系统根据每个任务的优先级为每个任务分配合适的时间 片,每个时间片大约都有零点几秒,虽然看起来很短,但实际上已经足够计算机完成成千
上万的指令集。每个任务都会被系统运行一段时间,然后挂起,系统转而处理其他任务; 过一段时间以后再回来处理这个任务,直到某个任务完成,
从任务队列中去除。    Linux系统上所有运行的东西都可以称之为一个进程。每个用户任务、每个系统管理 守护进程,都可以称之为进程
Linux用分时管理方法使所有的任务共同分享系统资源。 我们讨论进程的时候,不会去关心这些进程究竟是如何分配的,或者是内核如何管理分配
时间片的,我们所关心的是如何去控制这些进程,让它们能够很好地为用户服务。    进程的一个比较正式的定义是:在自身的虚拟地址空间运行的一个
单独的程序。进 程程序是有区别的,进程不是程序,虽然它由程序产生。程序只是一个静态的指令集合 ,不占系统的运行资源;而进程是一个随时都
可能发生变化的、动态的、使用系统运行资 源的程序。而且一个程序可以启动多个进程。   Linux操作系统包括三种不同类型的进程,每种进程都有自己
的特点和属性。   交互进程——由一个shell启动的进程。交互进程既可以在前台运行,也可以在后台运行 批处理进程——这种进程和终端没有联系,
是一个进程序列   监控进程(也称守护进程)——Linux系统启动时启动的进程,并在后台运行。    上述三种进程各有各的作用,使用场合也有所
不同。    进程作业的概念也有区别。一个正在执行的进程称为一个作业,而且作业可以包 含一个或多个进程,尤其是当使用了管道和重定向命令。
例如“nroff -man ps.1|grep kill|more”这个作业就同时启动了三个进程。    作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个
进程,等一 会儿再继续执行该进程。shell将记录所有启动的进程情况,在每个进程过程中,用户可 以任意地挂起进程或重新启动进程作业控制是许
多shell(包括bash和tcsh)的一个特 性,使用户能在多个独立作业间进行切换。    一般而言,进程作业控制相关联时,才被称为作业。   
在大多数情况下,用户在同一时间只运行一个作业,即它们最后向shell键入的命令 。但是使用作业控制,用户可以同时运行多个作业,并在需要时在
这些作业间进行切换。 这会有什么用途呢?例如,当用户编辑一个文本文件,并需要中止编辑做其他事情时,利 用作业控制,用户可以让编辑器暂
时挂起,返回shell提示符开始做其他的事情。其他事 情做完以后,用户可以重新启动挂起的编辑器,返回到刚才中止的地方,就象用户从来没 有离开
编辑器一样。这只是一个例子,作业控制还有许多其他实际的用途。

posted @ 2012-04-25 17:34 多彩人生 阅读(494) | 评论 (0)编辑 收藏

SetConsoleCtrlHandler

       有时候运行在服务器上的控制台程序,需要记录详细的运行日志,这就需要对程序关闭进行日志记录,以便能根据日志了解程序的运行状况。比如正在运行的程序被 人不小心关闭了,导致最终任务没有运行成功,这时日志也没有错误记录,对分析原因造成不便,记录了关闭事件日志后就能了解到这种情况是程序被终止了。这样 注意通过消息钩子来实现,通过调用WIN32 API SetConsoleCtrlHandler方法来实现,具体代码如下:


using System;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;


namespace ConsoleColsed
{
    public delegate bool ConsoleCtrlDelegate(int ctrlType);
    class Program
    {
        [DllImport("kernel32.dll")]
        private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);
        //当用户关闭Console时,系统会发送次消息
        private const int CTRL_CLOSE_EVENT = 2;
        //Ctrl+C,系统会发送次消息
        private const int CTRL_C_EVENT = 0;
        //Ctrl+break,系统会发送次消息
        private const int CTRL_BREAK_EVENT = 1;
        //用户退出(注销),系统会发送次消息
        private const int CTRL_LOGOFF_EVENT = 5;
        //系统关闭,系统会发送次消息
        private const int CTRL_SHUTDOWN_EVENT = 6;

        static void Main(string[] args)
        {
            Program cls = new Program();
            //Console.ReadKey();
        }
        public Program()
        {
            ConsoleCtrlDelegate consoleDelegete = new ConsoleCtrlDelegate(HandlerRoutine);

            bool bRet = SetConsoleCtrlHandler(consoleDelegete, true);
            if (bRet == false) //安装事件处理失败
            {
                Debug.WriteLine("error");
            }
            else
            {
                Console.WriteLine("ok");
                Console.Read();
            }

        }

        private static bool HandlerRoutine(int ctrlType)
        {
            switch(ctrlType)
            {
                case CTRL_C_EVENT:
                    MessageBox.Show("C");
                    break;
                case CTRL_BREAK_EVENT:
                    MessageBox.Show("BREAK");
                    break;
                case CTRL_CLOSE_EVENT:
                    MessageBox.Show("CLOSE");
                    break;
                case CTRL_LOGOFF_EVENT:
                    break;
                case CTRL_SHUTDOWN_EVENT:
                    break;
            }
            //return true;//表示阻止响应系统对该程序的操作
            return false;//忽略处理,让系统进行默认操作
        }
    }
}

CTRL_CLOSE_EVENT 这些都是在C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\WinCon.h中定义的,c或者c++调用包含这个头文件就可以。

return true的时候关闭的时候会产生应用程序无法关闭的错误,不知道什么原因。return false则不会。根据msdn上的方法说明 If the function handles the control signal, it should return TRUE. If it returns FALSE, the next handler function in the list of handlers for this process is used. 按照这个解释,返回true也不应该出现应用程序无法关闭的错误,不知道是什么原因。

posted @ 2012-04-24 22:44 多彩人生 阅读(1200) | 评论 (0)编辑 收藏

程序

程序大体是这样的:
一个入口, 然后初始化一些数据,然后进入一个循环不停地处理事件。这个事件可能是操作界面所触发,可能是网络数据所触发

posted @ 2012-04-24 14:13 多彩人生 阅读(152) | 评论 (0)编辑 收藏

memmove 和 memcopy

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;
}

posted @ 2012-04-23 18:28 多彩人生 阅读(5882) | 评论 (1)编辑 收藏

asio

http://www.rosoo.net/a/201002/8563.html

posted @ 2012-04-22 23:21 多彩人生 阅读(179) | 评论 (0)编辑 收藏

模板

// 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;
}

posted @ 2012-04-20 17:00 多彩人生 阅读(205) | 评论 (0)编辑 收藏

Linux中如何让进程在后台运行

http://www.ningoo.net/html/2008/how_to_run_processes_on_background_in_linux.html

posted @ 2012-04-19 00:23 多彩人生 阅读(344) | 评论 (0)编辑 收藏

linux 学习之路

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 命令建立剖析信息.

posted @ 2012-04-18 19:43 多彩人生 阅读(302) | 评论 (0)编辑 收藏

仅列出标题
共25页: First 16 17 18 19 20 21 22 23 24 Last 

导航

统计

常用链接

留言簿(3)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜