
Linux
xiaoyi239
这个作者很懒,什么都没留下…
展开
-
Linux杂记
最近一段时间似乎国内的Debian源不是很好用,自163资助cn99以来,似乎源的更新一直不是很及时,而且在我这里连接速度也不是很快,但是有一个这样的源总归还是一件好事。似乎国内的企业对开源或是自由软件不是很热心,而更多的时候大家只是纯粹的拿来,以满足自己的需求为唯一目的,至于所谓的贡献与反馈似乎从来就没有想过,更不要说实际的行动了。相比而言,163至少还为大家提供了开源服务。一直以来在使...2009-09-04 23:28:00 · 93 阅读 · 0 评论 -
进程间通信(二)
传递更多的数据到目前为止我们所用的机制只是简单的在一个fread或是fwrite中发送或是接收全部的数据。有时我们也许以更小的尺寸发送数据,或是也许我们并不知道输出的大小。为了避免声明一个大的缓冲区,我们可以使用多个fread或是fwrite调用并分别处理这些数据。下面是一个程序,popen3.c,由一个管道中读取所有的数据。试验--由一个管道读取大量的数据在这个程序中,我们由...2009-08-01 13:00:00 · 104 阅读 · 0 评论 -
进程间通信(一)
第13章 进程间通信:管道在第11章,我们了解了使用信号在两个进程之间发送消息的一个简单方法。我们创建了可以用来引起响应的通知事件,但是所传递的信息限制于一个信号数量。在这一章,我们将会了解管道,这会允许在进程之间交换更为有用的数据。在本章的结尾,我们将会使用我们的新知识来重新将CD数据库程序实现为一个非常简单的客户/服务器程序。在本章,我们将会涉及下列主题:管道的定义处理...2009-07-31 15:41:00 · 96 阅读 · 0 评论 -
POSIX线程-(六)
线程属性-调度下面我们来看一下我们也许希望改变的第二个线程属性:调度。改变调度属性与设置分离属性相类似,但是我们可以使用另外两个函数来查找可用的等级级别,sched_get_priority_max与sched_get_priority_min。试验--调度因为thread6.c是与前面的例子十分类似,这里我们只看一下其中的区别。1 首先,我们需要一些额外的变量:int...2009-07-23 18:24:00 · 85 阅读 · 0 评论 -
POSIX线程-(五)
线程属性当我们第一次了解线程时,我们并没有讨论线程属性的问题。我们现在会进行讨论。线程有许多我们可以控制的属性。然而,在这里我们只讨论那些我们最需要的线程属性。其他属性的详细信息可以在手册中了解到。在所有我们前面的例子中,我们不得不在允许程序退出之前使用pthread_join来重新同步我们的线程。如里我们希望允许一个线程向创建他的线程返回数据时我们需要这样做。有时我们并不需要第二个线...2009-07-21 18:02:00 · 89 阅读 · 0 评论 -
POSIX线程-(四)
使用互斥同步在多线程程序中同步访问的另一个方法就是使用互斥,其作用允许程序锁住一个对象,从而只有一个线程可以访问他。要控制对临界区代码的访问,在我们进入这段代码之前锁住一个互斥量,并且在我们完成操作时进行解锁。使用互斥所需要基本函数与信号量所需要的函数相似,其声明如下:#include <pthread.h>int pthread_mutex_init(pthrea...2009-07-19 15:06:00 · 92 阅读 · 0 评论 -
POSIX线程(三)
并发执行下面我们将要编写一个检测两个线程是否并发执行的程序。因为我们还没有了解要有效完成这一任务所需要的线程同步的知识,所以这并不是一个高效完成在线程之间称之为池操作的程序。再一起说明,我们要利用这一事实,在一个进程内部的不同线程之间共享除了局部函数变量之外的所有变量。试验--两个线程的同步执行在这一部分,我们所创建的程序thread2.c,是对thread1.c进行了简单的修改而...2009-07-08 18:21:00 · 93 阅读 · 0 评论 -
POSIX线程(二)
第一个线程程序有一个完整的与线程相关的库调用集合,其中的大多数名字以pthread_开头。要使用这些库调用,我们必须定义宏_REENTRANT,包含文件pthread.h,并且使用-lpthread来链接线程库。当设计原始的Unix与POSIX库函数时,假定在任何进程中只有一个执行线程。一个明显的例子就是errno,这个变量用于在调用失败之后获取错误信息。在一个多线程程序中,默认情况下...2009-07-05 10:32:00 · 97 阅读 · 0 评论 -
数据管理(八)--CD程序
CD程序我们已经了解了环境以及管理数据的相关内容了,现在是更新程序的时候了。dbm数据库看起来对于存储我们的CD信息是十分合适的,所以我们会将dbm数据用作我们的新实现的基础。更新设计因为这次更新涉及到一个重要的代码重写,所以现在我们需要看一下我们的设计描述以确定是否需要修改。使用以逗号分隔的可以变化的文件来存储信息,尽管在Shell中很容易实现,但是已经证明是十分严格的了。大量的CD标题以及音轨...2009-01-10 19:22:00 · 240 阅读 · 0 评论 -
数据管理(七)
其他的dbm函数现在我们已经看到基本的dbm函数,我们可以简要的介绍一下dbm所使用的其他的函数:int dbm_delete(DBM *database_descriptor, datum key);int dbm_error(DBM *database_descriptor);int dbm_clearerr(DBM *database_descriptor);datum dbm_firstk...2009-01-10 19:18:00 · 95 阅读 · 0 评论 -
数据管理(六)
数据库我们已经了解了如何使用文件来存储数据,所以为什么我们应该使用数据库呢?非常简单,在某些环境下,数据库特性提供了更好的方法来解决问题。使用数据库要好于存储文件,有下面两个理由:我们可以存储尺寸上变化的数据记录,而这使用普通,无结构的文件是难于实现的。数据库的存储与数据的读取使用索引。最大的好处就在于这个索引不必是一个简单的记录号,这在普通文件中是很容易使用的,而是字符串。dbm数据库所有的Li...2009-01-08 22:54:00 · 84 阅读 · 0 评论 -
数据管理(五)
竞争锁现在我们已经了解了如何测试文件上已经存在的锁,下面我们来看一下当两个程序在文件的同一块区域竞争锁时会出现什么情况。我们将会使用我们的lock3程序在文件的第一个位置进行加锁操作,然而一个新的程序在同样的位置尝试加锁。要完成这个例子,我们需要添加一些解锁操作。试验--竞争锁下面是程序lock5.c,试图在文件中已被加锁的区域进行加锁操作,而不是测试文件不同部分的锁状态。1 在#include以...2008-12-28 21:21:00 · 124 阅读 · 0 评论 -
数据管理(四)
锁区域创建锁文件对于资源的排他访问,例如串口,是相当合适的,但是对于访问大的共享文件就是太好了。假如我们拥有一个由一个程序写入的大文件,但是是由许多不同的程序进行持续更新的。当一个程序正在记录一些在较长的时间内所得到的数据,并且正在为其他的一些程序进行处理时就会出现这样的情况。这些正在处理的程序并不会等待日志程序结束--他们是连续运行的--所以他们需要一些合作的方法从而可以提供对于同一个文件的同时...2008-12-27 23:02:00 · 86 阅读 · 0 评论 -
进程间通信(三)
管道调用我们已经了解了高层的popen函数,现在我们继续来了解低层的pipe函数。这个函数提供了一个在两个函数之间传递数据的方法,而不必调用shell来解释所请求的命令的。同时他也为我们提供了更多的数据读写控制。pipe函数的原型如下:#include <unistd.h>int pipe(int file_descriptor[2]);pipe函数接受一个两个...2009-08-02 09:04:00 · 112 阅读 · 0 评论 -
开发工具
在这一章,我们将会讨论在Linux系统上可用的程序开发工具,其中一些在Unix系统上也可用。除了必须的编译器与调试器以外,Linux提供了一个工具集,其中的每一个工具都完成单独的工作,并且允许开发者以新的方式对这些工具进行组合。这就是Linux所继承的Unix哲学的一部分。在这里,我们将会讨论其中的一些重要工具,并且会讨论使用这些工具解决问题的例子,包括:make命令以及makefile使用RCS...2009-02-17 22:21:00 · 76 阅读 · 0 评论 -
关于Beginning Linux Programming 3ed
关于<Beginning Linux Programming 3ed>近两年来在我的博客里陆续发的一些关于Linux编程的文章是译自Wrox公司的<Beginning Linux Programming 3ed>一书,在此感谢朋友们的支持。另外需要说明的一点就是,记得07年的冬天我在长沙逛书店的时候似乎看到了这本书的中文译本,所以提醒朋友们,如果觉得这本书对自己有用,可以到书店买中...2009-08-25 19:00:00 · 79 阅读 · 0 评论 -
进程间通信应用-CD程序
CD数据库程序现在我们可以使用我们在这一章所了解的IPC工具来修改我们的CD数据库程序。我们可以使用三种IPC工具的多种不同组,但是因为我们需要传送的信息很少,直接使用消息队列实现请求的传递是一个很明显的选择。如果我们需要传递的数据量很大,我们可以考虑使用共享内存传递实际的数据,并且使用信号量或是消息来传递一个标记通知其他的进程在共享内存中有数据可用。消息队列接口解决我们了在第...2009-08-25 18:06:00 · 121 阅读 · 0 评论 -
进程间通信之消息队列
消息队列现在我们来讨论第三种也是最后一种System V IPV工具:消息队列。在许多方面看来,消息队列类似于有名管道,但是却没有与打开与关闭管道的复杂关联。然而,使用消息队列并没有解决我们使用有名管道所遇到的问题,例如管道上的阻塞。消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法。与有名管道比较起来,消息队列的优点在独立于发送与接收进程,这减少了在打开与关闭有名管道之...2009-08-24 23:33:00 · 100 阅读 · 0 评论 -
进程间通信之共享内存
共享内存共享内存是第二种IPC工具。他允许两个无关的进程访问相同的逻辑内存。共享内存是在两个运行的程序之间传递数据的有效手段。尽管X/Open标准并没有要求,很可能绝大数的共享内存实现都是会将不同进程之间正在共享的内存安排在相同的物理内存中。共享内存为在多个进程之间共享与传递数据提供一个有效的手段。因为他并没有提供同步的方法,所以通常我们需要使用其他的机制来同步对共享内存的访问。通常,...2009-08-23 11:51:00 · 116 阅读 · 0 评论 -
Linux进程间通信之信号量
第14章 信号量,共享内存与消息队列在这一章,我们将会讨论Unix发行版AT&T系统V.2所引入的进程通信工具集合。因为这些程序出现在相关的发行版本中并且具有类似的编程接口,他们通常被称之为IPC程序,或是更为通常的System V IPC。正如我们已经了解到的,他们绝不是进程之间通信的唯一方法,但是System V IPC通常用来指这些特殊的程序。在这一章,我们将会讨论下列内...2009-08-22 08:43:00 · 139 阅读 · 0 评论 -
fglrx 9.8与kernel 2.6.30
Linux Kernel 2.6.30的发布已是很早之前的事情了,而且在其发布后不久就为了尝鲜在自己的机子上编译了2.6.30的内核,无奈fglrx 9.6与9.7都不对其进行支持,无法在新版本的内核下编译安装fglrx驱动,没有办法一直在2.6.29的内核下配合fglrx 9.5进行使用,因而在每次更新时都会期盼fglrx的更新,然而其更新版本都不能进行成功的编译,实是无奈啊!!昨天进行...2009-08-20 12:11:00 · 101 阅读 · 0 评论 -
进程间通信(九)
管道下面是管道实现文件,pipe_imp.c,其中有客户端与服务器端函数。试验--管道实现头文件1 首先是#include:#include "cd_data.h"#include "cliserv.h"2 我们定义一些在此文件的其他函数中所需要的值:static int server_fd = -1;static pid_t mypid = 0;stati...2009-08-15 10:49:00 · 83 阅读 · 0 评论 -
进程间通信(八)
搜索数据库在CD关键字上的搜索比较复杂。函数的用户希望一旦调用就启动一个搜索。我们在第7章通过将在第一次调用上的*first_call_ptr设置为true并且函数返回第一个匹配结果来满足这种需求。在接下来的搜索函数调用中,*first_call_ptr设置为false,从而会返回更多的匹配,每次调用返回一个匹配结果。现在我们已经将程序分为两个进程,我们不能再允许搜索在服务器端一次处理...2009-08-11 23:25:00 · 98 阅读 · 0 评论 -
进程间通信(七)
CD数据库程序现在我们已经了解了我们可以如何使用有名管道来实现一个简单的客户端/服务器系统,我们可以重新查看我们的CD数据库程序并且进行相应的修改。我们同时组合了一些信号处理从而允许我们在进程被中断时进行一些清理动作。我们会使用我们前面的具有一个命令行接口的dbm版本,从而进可能直接的查看代码。在我们更为详细的讨论新版本的代码之前,让我们先编译这个程序。如果我们有由Web站点所获得的源...2009-08-09 10:11:00 · 104 阅读 · 0 评论 -
进程间通信(六)
读取与写入FIFO使用O_NONBLOCK模式会影响作用在FIFO上的read与write调用的行为。在一个空的阻塞FIFO(例如,没有使用O_NONBLOCK打开的)上的read调用将会等待直到有数据可以读取。相反,在非阻塞且没有数据的FIFO上进行read调用将会返回0字节。在一个完全阻塞的FIFO上的write调用将会等待直到数据可以写入。在一个不能全部接受所有将要写入数据的...2009-08-08 10:08:00 · 92 阅读 · 0 评论 -
进程间通信(五)
有名管道:FIFO到目前为止,我们只是可以在两个相关的程序之间传递数据,也就是说,由一个共同的祖先进程启动的程序。通常这并不是十分方便,因为我们希望不相关的进程也可以交换数据。我们可以使用FIFO来实现这个操作,通常称之为有名管道。一个有名管道是在文件系统中作为名字存在的一个特殊的文件类型(记住,在Linux一切皆文件),但是行为类似于我们已经了解的无名管道。我们可以通过命令行或是...2009-08-04 12:20:00 · 100 阅读 · 0 评论 -
进程间通信(四)
父子进程我们的pipe调用探索的下一步就是使得子进程是与父进程不同的一个程序,而不是运行相同程序的另一个进程。我们可以使用exec调用来完成这个任务。这样做的一个困难就是通过exec执行的新进程需要知道访问哪一个文件描述符。在exec调用之后,就不再是这样的情况了,因为老进程已经被新的子进程所替代。我们可以通过向exec所执行的新进程传递文件描述符作为参数就可以解决这个问题。要显示这是...2009-08-03 12:37:00 · 90 阅读 · 0 评论 -
POSIX线程(一)
第12章 POSIX线程在第11章,我们看到在Linux中进程是如何被处理的。这些多进程的特性很久以来就是类Unix操作系统的特性。有时使用fork创建一个新进程的代价实在是太大了。在这种情况下,使得一个程序同时做两件事情,或者至少看起来是如此是十分有用的。相对应的,我们也许希望以同样的方式同时发生两个或是更多的事情。这就是线程开始的地方。在这一章,我们将会了解:在一个进程内创建一...2009-06-21 20:46:00 · 82 阅读 · 0 评论 -
进程与信号(五)
健壮的信号接口我们已经讨论了使用signal来发出与捕获信号,因为他们在较为旧的Unix程序中很常见。然而,X/Open与Unix规范推荐了一个更为健壮的用于信号处理的新的编程接口:sigaction。#include <signal.h>int sigaction(int sig, const struct sigaction *act, struct sigacti...2009-06-13 10:45:00 · 109 阅读 · 0 评论 -
进程与信号(四)
线程Linux进程可以协作,可以发送消息,也可以中断另一个进程。他们甚至可以在彼此之间共享内存段,但是在操作系统内部他们却是完全不同的实体。他们并不能共享变量。在许多Unix系统与Linux系统还有另一类名为线程的进程。线程在某些程序中具有巨大的价值,例如多线程数据库服务器,然而线程很难进行编程。Linux上的线程编程并不如使用多进程那样常见,因为Linux的进程是轻量级的,而且...2009-06-10 18:38:00 · 127 阅读 · 0 评论 -
使用curses管理基于文本的屏幕--(七)
填充当我们编写更为高级的curses程序时,我们会发现有时我们可以很容易的构建一个逻辑屏幕,然后将这个逻辑屏幕中的所有或是部分内容输出到物理屏幕上。有时,我们会得到一个比实际的物理屏幕要大的逻辑屏幕,并且每次只显示逻辑屏幕的部分内容。就目前而言,使用curses函数来实现这样的功能对于我们并不是十分容易,因为所有的窗体必须不大于物理屏幕。curses确实提供了一个特殊的数据结构,pad,来操作并不...2008-11-05 22:38:00 · 85 阅读 · 0 评论 -
使用curses管理基于文本的屏幕--(六)
颜色最初,很少有哑终端可以支持颜色,所以大多数早期的curses版本并不会支持颜色。现在,颜色是大家所期望的,而且被ncurses以及大多数现在的curses实现所支持。不幸的,curses的哑屏幕的起源深深影响了API,所以curses使用一种特殊严格的方法来支持颜色,这也反映了早期颜色终端的能力不足。屏幕上的每一个字符都可以使用许多不同的颜色显示在屏幕上,而不是使用各种不同的背景底色。例如,我...2008-11-02 23:44:00 · 100 阅读 · 0 评论 -
使用curses管理基于文本的屏幕--(五)
子窗体现在我们已经探讨了多窗体,现在我们可以来看一下一类特殊的多窗体,名为子窗体。我们可以用下面的函数调用来创建和销毁子窗体:#include <curses.h>WINDOW *subwin(WINDOW *parent, int num_of_lines, int num_of_cols, int start_y, int start_x);int de...2008-10-23 21:28:00 · 116 阅读 · 0 评论 -
使用curses管理基于文本的屏幕--(四)
窗口直到现在,我们一直将终端作为一个全屏幕的媒介来使用。通常对于小而简单的程序来说这已经足够了,但是curses库所走的路还要更远一些。我们可以同时在物理屏幕上显示多个不同的尺寸的窗口。在这一节将要讨论到一些函数只会被X/Open扩展的curses所支持。然而,因为他们被ncurses所支持,所以在大多数的平台上使用并没有太多的问题。我们现在就来讨论使用多个窗口的问题。我们同时也会看到到目前为止我...2008-10-22 22:30:00 · 100 阅读 · 0 评论 -
使用curses管理基于文本的屏幕--(三)
键盘除了提供一个简单的接口用来管理屏幕以外,curses同时提供了一个更为简单的方法用来控制键盘。键盘模式键盘的读取例程是由模式来控制的。用来设置模式的函数为:#include <curses.h>int echo(void);int noecho(void);int cbreak(void);int nocbreak(void);int raw(void);int noraw(voi...2008-10-21 23:02:00 · 91 阅读 · 0 评论 -
让Debian服务器支持jsp程序
From:http://www.linuxsir.org/bbs/thread336246.html Author:cioworld 我用Debian架好了Apache2+PHP5+MySQL5环境,一朋友把他的网站移过来,我倒,竟然用的JSP的程序架的。得,要快点支持jsp。偶以前没弄过,找了N多资料(先鄙视一下那些垃圾站,抓文章都抓的不完整,让人没法看,Y的还把排名弄得这么前,害人命啊。...2008-10-17 18:31:00 · 124 阅读 · 0 评论 -
使用curses管理基于文本的屏幕--(二)
初始化与结束正如我们所看到的,所有的curses必须与initscr开始,并且以endwin结束。下面是他们头文件的定义:#include <curses.h>WINDOW *initscr(void);int endwin(void);在每个程序中initscr应只被调用一次。如果函数调用成功,initscr函数会返回一个指向stdscr结构的指针。如果函数失败,他只简单的打印出一个...2008-10-08 20:31:00 · 110 阅读 · 0 评论 -
使用curses管理基于文本的屏幕--(一)
在第5章,我们了解了如何在字符上进行更好的控制以及如何以一种独立终端的方式来提供字符输出。使用通用终端接口(GTI,termios)以及使用tparm及其相关函数操作转义字符的问题在于他需要大量的底层代码。对于许多程序而言,更需要一个高层接口。我们希望可以简单在屏幕上进行绘制,并且使用一个函数库来自动处理终端依赖。在这一章,我们将要了解的正是这样的一个库,curses库。curses标准的重要性就...2008-10-07 23:50:00 · 101 阅读 · 0 评论 -
Grub SplashImage
前一段时间在论坛上看到有文章谈到使用gfxboot来美化Grub启动界面,看着那些贴出的华丽界面,心里确实痒痒的,如是就按着文章里所说的下载相应的软件包来安装试验,也居然出来了效果,在前面的文章中记下了相关的方法步骤。然而好景不长,今天偶然间发现gfxboot居然不能启动我机子上的FreeBSD,命令都是一样的,配置也都是一样,就是起不来。心里郁闷,于是决定重新安装原始的Grub,不求华丽,但是实...2008-09-27 19:55:00 · 266 阅读 · 0 评论 -
Debian与《玩具总动员》
Debian 过往版本的代号1.1 - Buzz 1.2 - Rex 1.3 - Bo 2.0 - Hamm 2.1 - Slink 2.2 - Potato 3.0 - Woody 3.1 - Sarge 4.0 - Etch 到目前为止Debian的发行版名称均出自Pixar的电影《Toy Story》,中文名称叫做 “玩具总动员”。看看下面的发...2009-04-19 16:58:00 · 382 阅读 · 1 评论