随笔分类 - Linux编程
摘要:一、中断处理为什么要下半部?Linux在中断处理中间中断处理分了上半部和下半部,目的就是提高系统的响应能力和并发能力。通俗一点来讲:当一个中断产生,调用该中断对应的处理程序(上半部)然后告诉系统,对应的后半部可以执行了。然后中断处理程序就返回,下半部会在合适的时机有系统调用。这样一来就大大的减少了中断处理所需要的时间。二、那些工作应该放在上半部,那些应该放在下半部?没有严格的规则,只有一些提示:1、对时间非常敏感,放在上半部。2、与硬件相关的,放在上半部。3、不能被其他中断打断的工作,放在上半部。以上三点之外的,考虑放在下半部。三、下半部机制在Linux中是怎么实现的?下半部在Linux中有以
阅读全文
摘要:Unix/Linux的接口设计有一句通用的格言“提供机制而不是策略”。区别对待机制(mechanism)和策略(policy)是Unix设计中的一大亮点。大部分的编程问题都可以被切割成两个部分:“需要提供什么功能”(机制)和“怎样实现这些功能”(策略)。如果由程序中的独立部分分别负责机制和策略的实现,那么开发软件就更容易,也更容易适应不同的需求。开源-展现在我们面前的是数以千计的代码,在那一行行的代码背后,到底蕴藏着怎样的设计思想,高手们曾怎样苦思冥想。在一堆堆的代码面前,有时候,我们很容易迷失曾经进来的入口,而掉入符号,变量以及函数堆积成的沼泽地。操作系统的本质是什么?管理者?亦或服务者?但
阅读全文
摘要:1 引言 Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文件 I/O 系统调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,对文件的操作可以跨文件系统而执行。如图 1 所示,我们可以使用 cp 命令从 vfat 文件系统格式的硬盘拷贝数据到 ext3 文件系统格式的硬盘;而这样的操作涉及到两个不同的文件系统。图 1. 跨文件系统的文件操作“一切皆是文件”是 Unix/Linux 的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、套接字等在 Unix/Linux 中都是以文件被对待;它们虽然类型不同
阅读全文
摘要:我这里说的ioctl函数是在驱动程序里的,因为我不知道还有没有别的场合用到了ioctl, 所以就规定了我们讨论的范围。为什么要写篇文章呢,是因为我前一阵子被ioctl给搞混 了,这几天才弄明白它,于是在这里清理一下头脑。 一、 什么是ioctl。 ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就 是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数 如下: int ioctl(int fd, ind cmd, …); 其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程...
阅读全文
摘要:在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值。cmd除了可区别数字外,还包含有助于处理的几种相应信息。 cmd的大小为 32位,共分 4 个域: bit31~bit30 2位为 “区别读写” 区,作用是区分是读取命令还是写入命令。 bit29~bit15 14位为 "数据大小" 区,表示 ioctl() 中的 arg 变量传送的内存大小。 bit20~bit08 8位为 “魔数"(也称为"幻数")区,这个值用以与其它设备驱动程序的 ioctl 命令进行区别。 bit07~bit00 8
阅读全文
摘要:与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用。条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。条件的检测是在互斥锁的保护下进行的。如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。如果两进程共享可
阅读全文
摘要:简介:服务器程序利用线程技术响应客户请求已经司空见惯,可能您认为这样做效率已经很高,但您有没有想过优化一下使用线程的方法。该文章将向您介绍服务器程序如何利用线程池来优化性能并提供一个简单的线程池实现。线程池的技术背景在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生
阅读全文
摘要:Tcl简介(一):Tcl 语法Tcl 语法Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以释运行,其强大的功能和简单精妙的语法会使你感到由衷的喜悦,这片文章对 Tcl有很好的描述和说明。如果你看起来很吃力,那是因为 Tcl与一般的语言有一些不同之处,刚开始可能有一些不理解,但很快就会掌握的。请坚持一下,我能坚持写完,你至少也应该坚持读一遍吧!Tcl Overview这篇文章里包含了几乎 Tcl 的全部。文章的作者是Tcl的缔造者John Ousterhout,对Tcl的诠释非常清楚。Introduction 简介Tcl 代表 "tool command language&qu
阅读全文
摘要:feof()的实现与平台有关。在stdio.h中feof的定义:#define _IOEOF 0x0010#define feof(_stream) ((_stream)->_flag & _IOEOF)由此可知,只有当fp->_flag & 0x0010为真时,才认为文件结束了。在VC里,只有当file position indicator(在Windows上是fp->_ptr)到了文件末尾,然后再发生读/写操作时,fp->_flag才会被置为含有_IOEOF,然后再调用feof(),才会得到文件结束的信息,并不是file position indic
阅读全文
摘要:#include <stdio.h>int fseek(FILE *fp, long offset, int whence);fseek 会调用 lseek,lseek 的功能是修改 file table 中 file 数据结构的 offset(内核层),offset(内核层)的值是由 offset(应用层)和 whence 计算而来。lseek system call has nothing to do with the seek operation that positions a disk arm over a particular disk sector。至此,fseek
阅读全文
摘要:1、时间类型。Linux下常用的时间类型:time_t,struct timeval,struct tm(1)time_t是一个长整型,一般用来表示用1970年以来的秒数。(2)Struct timeval有两个成员,一个是秒,一个是微妙。struct timeval { long tv_sec; long tv_usec; };(3)struct tm是直观意义上的时间表示方法:struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_.
阅读全文
摘要:popen函数的实现包括一下几步:1、使用pipe()建立管道2、使用fork()创建子进程3、在子进程中调用exec族函数执行命令,通过管道将结果传送至父进程4、在主进程中等待子进程执行,子进程执行完成后将接收其结果,返回结果的文件指针类似与system(fork与exec函数的组合),popen在启动另外一个线程时,该线程有可能启动失败或者popen执行shell时失败了,但这个时候popen本身不会报错,直接就造成调用popen的父进程卡住了。可以通过验证errno来避免。下面是popen()在linux中的实现:/**popen.cWrittenbyW.RichardStevens*/
阅读全文
摘要:linux文件IO操作可以分为两种:1.带缓存的文件IO操作,包括fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等2.不带缓存的文件IO操作,包括open, close, read, write, getc, getchar, putc, putchar 等两者的区别:1.带缓存的io操作是在标准C里面定义的(可移植),而不带缓存的io操作是POSIX中定义的(不可移植),属于系统调用。带缓存的实际上是在不带缓存的基础之上封装了一层,维护了一个输入输出缓冲区,使之能跨
阅读全文
摘要:1.vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。2.fork要拷贝父进程的进程环境;而vfork则不需要完全拷贝父进程的进程环境,在子进程没有调用exec和exit之前,子进程与父进程共享进程环境,相当于线程的概念,此时父进程阻塞等待。为什么会有vfork呢?因为以前的fork当它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,然后将会有两种行为:1.执行从父进程那里拷贝过来的代码段2.调用一个exec执行一个新的代码段当进程调用exec函数时,一个新程序替换了当前进程
阅读全文
摘要:取消命令在vi中,只要没有把修改结果存入磁盘文件中,那么就可以通过“取消”来撤销最近的操作或对缓冲区的修改。假设你无意删除了一行文本、改变了一些你不应该改变的内容或增加了一些不正确的文本,可以按<Esc>改变到命令模式中,然后按<u>,则文件内容恢复到修改前的样子。保存到文件名为filename的文件中发出写命令格式: :w filename不使用小键盘来定位光标vi用<h>、<j>、<k>、<l>键来定位光标。其中<h>、<l>键表示光标的左右移动,<j>、<k>键表示光标
阅读全文
摘要:Linux的变量种类,按变量的生存周期来划分,Linux变量可分为两类:永久的:需要修改配置文件,变量永久生效。临时的:使用export命令声明即可,变量在关闭shell时失效。设置变量的三种方法1 在/etc/profile文件中添加变量【对所有用户生效(永久的)】 用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。 例如:编辑/etc/profile文件,添加CLASSPATH变量 # vi /etc/profile export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib 注...
阅读全文
摘要:解压语法:tar [主选项+辅选项] 文件或者目录使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用。主选项:c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。相当于打包。x 从档案文件中释放文件。相当于拆包。t 列出档案文件的内容,查看已经备份了哪些文件。特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!因为不可能同时压缩与解压缩。辅助选项:-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩或解压? 一般格式为xx.tar.gz或xx. tgz-j :是否同时具有 bzip2 的属性?亦即是
阅读全文
摘要:NAMEinittab - 与 sysv 兼容的 init 进程使用的初始化文件格式 描述inittab 文件描述在系统引导及通常的操作期间, 都启动哪些进程 (比如 /etc/init.d/boot, /etc/init.d/rc, getty 等等). Init(8) 讨论有关 runlevels (运行级) 的概念, 每一个运行级都有它自己启动进程的集合. 有效的运行级为 0-6 加上用于 ondemand 条目的 A, B 和 C. inittab 文件中的每一个条目有如下的格式: id:runlevels:action:process 以 `#’ 开头的行被忽略. id initta
阅读全文
摘要:1.修改/etc/sysconfig/network里面的名字# vi /etc/sysconfig/networkNETWORKING=yesHOSTNAME=yourname2.修改/etc/hosts里面的名字# vi /etc/hosts127.0.0.1 localhost.localdomain yourname localhost3.最后在终端下执行:#hostname yourname查看主机名命令# uname -n
阅读全文
摘要:linux下强制踢掉登陆用户查看机器中登陆的用户[root@sunsyk ~]# w16:29:02 up 2 days, 2:35, 5 users, load average: 0.03, 0.05, 0.01USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot pts/1 :0.0 Tue15 2days 1:44 0.04s -bashroot pts/2 :0.0 Tue15 46:42m 0.05s 0.05s bashroot pts/3 :0.0 Tue15 2days 0.02s 0.02s bashroot pts/4 172.20.52
阅读全文