traplinux
linux中有trap命令可以拦截到ctrl+c信号并忽略它:
使用命令kill -l可以列出系统的信号名称,通常我们需要忽略的信号有四个,即:HUP, INT, QUIT, TSTP,也就是信号1, 2, 3, 24;
QUIT即信号3就是表示操作CTRL+C;
trap的使用格式为:
trap 操作 信号名称
例如: trap "echo iuioooo" 3 表示捕获到信号3(ctrl+c)时并不会退出而是会 执行命令echo iuioooo;
同样可以trap "" 3 表示什么也不操作。
使用 trap 3 来使其恢复默认设置。
⑵ 黑客网络新手指南翻译大全 黑客网络Hacknet新手怎么玩
黑客网络Hacknet你会玩了吗?小伙伴们是不是正在为看不懂英文而烦恼呢,不要烦恼,今日小编为大家带来最全的新手指南,全中文翻译哦,感兴趣的玩家赶紧来看看吧!
Basic Tips 基础窍门
***IMPORTANT*** Some computers/servers may have different names on them, but what you need to do should be the same. Just follow the steps, you will be fine.
***非常重要*** 有些电脑/服务器可能有不同的名字,但你所要做的应该相同。遵循如下步骤,您就不会有问题。
DON'T abandon any missions atm!! It will most likey cause serious problems and make you unable to finish the game!
眼下,***请勿***放弃任何任务!!这很可能导致严重问题并最终无法完成游戏,毁掉您的存档!
1, Type commands as soon as possible.
2, Delete logs when you disconnect.
3, You need to reply almost every time you finish a mission.
4, Always use "Scan Network" option when you successfully hack a computer.
5, Don't delete/rename files unnecessarily. <-This is important!!
6, Use auto-complete for commands and file names. (Tab key)
7, Always use "admin" "alpine" to log in to any eos devices.
1.尽速输入指令。(译者:更要善用Tab)
2.断线前别忘了删log。(译者:虽然我不删也没有什么麻烦……)
3.不要忘了完成任务时回复邮件。(极少数情况不需要)
4.成功骇入电脑时总扫描一遍主机。(译者:★★★★★推荐)
5.无必要时不要删除/重命名任何文件!<—十分重要。
6.使用“自动拼写”(Tab键)输入指令及文件名。
7.不要忘了“admin”“alpine”这神奇的eos设备账户。
译者:即使你希望独立完成游戏,我也非常推荐您阅读这些提示,它们非常有用。另外我在此补充几条。
(但愿我没记错……)
1.SQL的入侵工具和KBT,即104端口入侵工具可以忽视Proxy和Firewall。
2.Firewall和Proxy的破解是独立的,你可以一边破解proxy一边analysis。更有甚者,用Tracekill可以允许您慢悠悠地破解完Firewall,再攻破proxy。
3.在shell里按overload破解proxy,对吧?然而如果内存不足,这些窗口会折叠,并在内存足够时展开。(如果我说的不清楚,可以试着在您的电脑上运行一堆shell并点按trap,然后关掉其中一个窗口。)除了略有点壮观以外,这是个“储存”足够多shell的小技巧。
4.不过,5~7个shell一般够了。
5.在几次analyze后弹出的几行文字里应该会各有一个字符,如果某一行里全是”0”怎么办?有时这意味着所对应的代码就是0。例如:(只是示范)
0 0 0 0 0 0 0 0 0 0 2 0 0 0
0 0 0 0 0 5 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
结果就是250。(我才不是250呢!)
Troubleshooting Common Problems
Q, I don't get an email to start a new mission!! What do I do now!?
A, Make sure to check following things:
1, Your previous mission has finished. (Click "Reply" in the email for it and see if "Mission Incomplete" message shows up.)
2, You don't have any available missions in your current faction's contracts server. (Or the message board if you're working on /el missions.)
3, Restart your game and your problem is still there.
常见问题解决方案。(疑难杂症)
Q:我得不到开始新任务的邮件!!我该怎么办!
A:出门检查您的邮筒(划掉)。请确认您已检查过以下条件。
1.你上一个的任务已完成。[尝试点按邮件中的“Reply”(回复)看会不会出现“Mission incomplete”(任务未完成)。]
2.在您现在所处的派系(Entropy,CSEC,…)没有可用的任务,或者
在/el任务里信息板上没有任务。
3.重启游戏问题仍存在。
For "gg wp" from Naix, you need to revenge Naix BEFORE you start any new Entropy mission. Details in "Naix Missions" section below.
对于Naix的“友善问好”,你要在完成Entropy任务***之前***对Naix报仇。下面的“Naix任务”一栏会给您帮助。
If none of these helps you, you might have had a critical bug... The devs are working on an update to fix many bugs, so wait for it... Meanwhile, you still can try 2 options:
1, Editing your save data (Here's the link: http:// http://steamcommunity.com/sharedfiles/filedetails/?id=500893610 Be super careful with your savedata.)
2, Start a new session (This is much easier... You also can work on achievements that you missed.)
若以上几条都不起作用,您已无药可救了(划掉)。您可能遇到了一个严重的bug(您不会连bug也不知道吧?)。开发者们(们?)在致力于更新游戏以修正bug。所以只能等了。
在此时,您可以尝试以下方法。
1.编辑您的存档。(敬参阅{链接已删除}请特别小心对待您的存档)
2.再开个存档。(不仅简单多了,还可以去做您以前忽略的成就。)
Q, I don't have the necessary exe file to do this mission!! UGGHHHH
A, Here is the list of exe files, and in which mission you can find them. Use "CTRL+F" on this guide and search for them.
Q.我怎么没有做任务所需的工具!!啊啊啊!!
A.这是exe文件列表及其来源,用"CTRL+F"在这指南里搜索一下。
SecurityTracer.exe - "First Contact", or on "Credit Server" after you finish the game.
SSHcrack.exe (for port 22) - "Getting Some tools together"
ftpBounce.exe (for port 21) - "Welcome"
eosDeviceScan.exe (for finding eos device) - "eOS Device Scanning"
SMTPoverflow.exe (for port 25) - "Aggression must be punished"
WebServerWorm.exe (for port 80) - "***Revenging Naix***", or "CSEC Invitation"
SQLBufferOverflow.exe (for port 1433) - "-Shrine of Polar Star-"
SQL_MemCorrupt.exe (for port 1433) - "CSEC Invitation - Congratulations"
Decypher.exe (for decrypting files) - "Ghosting the Vault"
DECHead.exe (for analyzing .dec files) - "Through the Spyglass"
KBT_PortTest.exe (for port 104) - "Project Junebug"
TraceKill.exe (for freezing traces) - "Bit -- Foundation"
Sequencer.exe (for the final hacking) - "Bit -- Termination"
Clock.exe (Um...just a clock app) - Read "-Finding Clock.exe-"
SecurityTracer.exe(安全追踪程序) -来自 "First Contact"(第一次沟通), 或在完成游戏时的"Credit Server" (荣誉服务器)上。
SSHcrack.exe (ssh协议破解器)(适用端口 22) - "Getting Some tools together"(收集些工具)
FTPBounce.exe (ftp“跳转攻击”破解器)(适用端口21) - "Welcome"(欢迎)
eosDeviceScan.exe(eos设备搜寻器) (适用寻找eos设备) - "eOS Device Scanning"(搜寻eos设备)
SMTPoverflow.exe(邮件过载破解器) (适用端口25) - "Aggression must be punished"(侵略者必将受惩处)
WebServerWorm.exe (网络蠕虫破解器)(适用端口80) - "***Revenging Naix***"(向Naix复仇 译者:这不是一个官方给出的任务名,我没记错的话。), or "CSEC Invitation"(CSEC诚邀您到来)
SQLBufferOverflow.exe (SQL内存缓冲区过载破解器)(适用端口1433) - "-Shrine of Polar Star-"(北极星圣地)
SQL_MemCorrupt.exe(SQL_内存错误破解器) (for port 1433) - "CSEC Invitation - Congratulations"(CSEC邀请-祝贺!)
(译者:根据另一个指南,这两个SQL破解器完全一样。)
Decypher.exe (解密器)(适用解密文件) - "Ghosting the Vault"[拱顶鬼神(?)]
DECHead.exe (十六进制文件头查看器/加密文件查看器?)(适用分析加密文件) - "Through the Spyglass"(通过望远镜)
KBT_PortTest.exe[KBT端口测试器(其实也是破解器。)] (适用端口104) - "Project Junebug"(Junebug项目)
TraceKill.exe(阻止追踪) (适用冻结追踪) - "Bit -- Foundation"(Bit-支柱)
Sequencer.exe(排序器) (适用最后骇入) - "Bit -- Termination"(Bit-终局)
Clock.exe (钟)(Hmm…只是个钟的软件) - Read "-Finding Clock.exe-"(敬参阅“寻找‘Clock.exe’”)
For KBT_PortTest.exe, you can try this method if you don't get "Project Junebug" unlocked, or mistakenly abandoned it. Thank you, Elsarild!
对于KBT_PortTest.exe,若您没有解锁“Junebug项目”,或失误取消了这个任务,可以试试这个方法。谢谢您,Elsarild!
http:// http://steamcommunity.com/sharedfiles/filedetails/?id=500893610
Q, I can't use this command somehow!! Fuuuuuuuuuuuuuuu
A, Make sure to check if you already have the necessary exe for the command, then try typing commands like below:
Q,由于某种原因我没法用这命令!(根据相关法律法规和政策,该信息不予公布)
A,确认您已具备所需的软件,然后根据以下范例输入命令。
译者:Hacknet的命令似乎更接近Linux。
Command Template - Example
命令 样板 - 范例
scp [the file's name] - scp index.html
connect [the IP address] - connect 103.33.8.643
cd [the folder path] - cd /log
replace [the file's name] "[target words]" "[your words]" - replace template.txt "[FIRST_NAME]" "John"
(If you use "cat" and open the file, you can use 'replace "[FIRST_NAME]" "John" ' instead. Use the full command above if you get "Assuming active flag file" error.)
Decypher [the file's name] [its password] - Decypher naix_secrets.dec D1CKS
DECHead [the file's name] - DECHead naix_private_photos.dec
mv [target's name] [new name] - mv template.txt Boorman_John[111]
scp (文件传输)[the file's name(文件名)] - scp index.html
connect(连接) [the IP address(IP地址)] - connect 103.33.8.643
cd (改变目录)[the folder path(文件地址)] - cd /log
replace(替换) [the file's name(文件名)] "[target words(文件中目标文字)]" "[your words(你想要替代它的文字)]" - replace template.txt "[FIRST_NAME]" "John"
[若您使用cat打开文件,你可以使用以下命令:“replace "[FIRST_NAME]" "John"”,若得到"Assuming active flag file"(译者:我对这句实在没辙……抱歉……)错误则打全整条命令。]
Decypher [the file's name(文件名)] [its password(其密码,有时没有)] - Decypher naix_secrets.dec D1CKS
mv(移动) [target's name(目标文件名)] [new name(新名)] - mv template.txt Boorman_John[111]
http://jiahao..com/s?id=1562388024263764&wfr=spider&for=pc
⑶ Linux内核调试工具KGDB
内核工具KGDB调试环境需要为Linux 内核加上 kgdb补丁,补丁实现GDB远程调试所需要的功能,包括命令处理、陷阱处理及串口通信3个主要的部分。KGDB补丁的主要作用是在Linux 内核中添加了一个调试Stub。调试Stub是Linux 内核中的一小段代码,是运行GDB的开发机和所调试内核之间的一个媒介。GDB和调试stub之间通过GDB串行协议进行通信。GDB串行协议是-种基于消息的ASCII 码协议,包含了各种调试命令。当设置断点时,KGDB将断点的指令替换为一条 trap指令,当执行到断点时控制权就转移到调试 stub中去。此时,调试stub 的任务就是使用远程串行通信协议将当前环境传送给GDB,然后从GDB处接收命令。GDB命令告诉stub 下一步该做什么,当stub收到继续执行的命令时,将恢复程序的运行环境,把对 CPU的控制权重新交还给内核。KGDB补丁给内核添加以下3个部件:
(1 ) GDB stub
GDB stub被称为调试插桩(简称为stub),是KGDB调试器的核心。它是Linux内核中的一小段代码,用来处理主机上: GDB发来的各种请求;并且在内核处于被调试状态时,控制目标机板上的处理器。
(2)修改异常处理函数
当这个异常发生时,内核将控制权交给KGDB调试器,程序进入KGDB提供的异常处理函数中。在里面,可以分析程序的各种情况。
(3)串口通信
GDB和 stub之间通过GDB串行协议进行通信。它是一种基于消息的ASCII 码协议,包含了各种调试命令。除串口外,也可以使用网卡进行通信。以设置内核断点为例说明KGDB与GDB之间的工作过程。设置断点时,KGDB修改内核代码,将断点位置的指令替换成一条异常指令(在ARM中这是一条未定义的指令)。当执行到断点时发生异常,控制权转移到stub 的异常处理函数中。此时,stub的任务就是使用GDB串行通信协议将当前环境传送给GDB,然后从GDB处接收命令,GDB命令告诉stub下一步该做什么。当stub收到继续执行的命令时,将恢复原来替换的指令、恢复程序的运行环境,把对CPU的控制权重新交还给内核。
⑷ linux中系统定义的64种信号分别什么意思
编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。
下面我们对编号小于SIGRTMIN的信号进行讨论。
1) SIGHUP
本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。
登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也能继续下载。
此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。
2) SIGINT
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。
3) SIGQUIT
和SIGINT类似, 但由QUIT字符(通常是Ctrl-\)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。
4) SIGILL
执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号。
5) SIGTRAP
由断点指令或其它trap指令产生. 由debugger使用。
6) SIGABRT
调用abort函数生成的信号。
7) SIGBUS
非法地址, 包括内存地址对齐(alignment)出错。比如访问一个四个字长的整数, 但其地址不是4的倍数。它与SIGSEGV的区别在于后者是由于对合法存储地址的非法访问触发的(如访问不属于自己存储空间或只读存储空间)。
8) SIGFPE
在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。
9) SIGKILL
用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。
10) SIGUSR1
留给用户使用
11) SIGSEGV
试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.
12) SIGUSR2
留给用户使用
13) SIGPIPE
管道破裂。这个信号通常在进程间通信产生,比如采用FIFO(管道)通信的两个进程,读管道没打开或者意外终止就往管道写,写进程会收到SIGPIPE信号。此外用Socket通信的两个进程,写进程在写Socket的时候,读进程已经终止。
14) SIGALRM
时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.
15) SIGTERM
程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。
17) SIGCHLD
子进程结束时, 父进程会收到这个信号。
如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程来接管)。
18) SIGCONT
让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符
19) SIGSTOP
停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.
20) SIGTSTP
停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号
21) SIGTTIN
当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.
22) SIGTTOU
类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.
23) SIGURG
有"紧急"数据或out-of-band数据到达socket时产生.
24) SIGXCPU
超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变。
25) SIGXFSZ
当进程企图扩大文件以至于超过文件大小资源限制。
26) SIGVTALRM
虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.
27) SIGPROF
类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.
28) SIGWINCH
窗口大小改变时发出.
29) SIGIO
文件描述符准备就绪, 可以开始进行输入/输出操作.
30) SIGPWR
Power failure
31) SIGSYS
非法的系统调用。
在以上列出的信号中,程序不可捕获、阻塞或忽略的信号有:SIGKILL,SIGSTOP
不能恢复至默认动作的信号有:SIGILL,SIGTRAP
默认会导致进程流产的信号有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
默认会导致进程退出的信号有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
默认会导致进程停止的信号有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
默认进程忽略的信号有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH
此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;SIGCONT在进程挂起时是继续,否则是忽略,不能被阻塞
⑸ 各位师傅:求教 1.linux下怎么统计网站的访问量2.linux下怎样设置snmp的trap目标
Linux使用的文件系统是ext2/ext3,你在xp下当然看不到。
如果需要在linux下可以共享xp的磁盘,就看你的xp分区磁盘是什么文件系统了。
如果是fat32,那么在linux下:
mkdir /xpdisk
mount -t vfat /dev/hdax /xpdisk
Linux下分区表示法如下,比如hda是第一个IDE的master,那么hda1就是该接口的第一个分区。所以按照这种情况针对你的电脑类推。
若能够挂载,则cd /xpdisk访问该分区。
访问完成记得umount /xpdisk
如果你的xp文件系统是ntfs,那么恐怕只能编译内核和借助第三方软件了。
⑹ 求教linux下如何配置snmp trap
安装snmp服务
CentOS/RedHat下可以只用yum命令进行安装。
$ yum –y install net-snmp net-snmp-devel
若要使用snmpwalk进行安装检测,则还需要安装net-snmp-utils包
$ yum –y install net-snmp-utils
Ubuntu可以通过apt-get install snmp snmpd 进行安装
设置安全的验证方式
将SNMP代理程序暴露给网络上的所有主机是很危险的,为了防止其它主机访问您的SNMP代理程序,我们需要在SNMP代理程序上加入身份验证机制。SNMP支持不同的验证机制,这取决于不同的SNMP协议版本,云监控目前支持v2c和v3两个版本,其中v2c版本的验证机制比较简单,它基于明文密码和授权IP来进行身份验证,而v3版本则通过用户名和密码的加密传输来实现身份验证,我们建议使用v3,当然,只要按照以下的介绍进行配置,不论是v2c版本还是v3版本,都可以保证一定的安全性,您可以根据情况来选择。
注意一点,SNMP协议版本和SNMP代理程序版本是两回事,刚才说的v2c和v3是指SNMP协议的版本,而Net-SNMP是用来实现SNMP协议的程序套件,目前它的最新版本是刚才提到的5.4.2.1。
v2c
先来看如何配置v2c版本的SNMP代理,我们来创建snmpd的配置文件,默认情况下它是不存在的,我们来创建它,如下:
sdo:~ # vi /usr/local/snmp/share/snmp/snmpd.conf
然后我们需要创建一个只读帐号,也就是read-only community,在snmpd.conf中添加以下内容:
rocommunity sdomonitor 114.80.132.9 rocommunity sdomonitor 58.215.169.26 rocommunity sdomonitor 58.215.169.27
如果想要检测服务是否成功开启,则还需要在snmpd.conf中添加:
rocommunity sdomonitor 127.0.0.1
注意,这里的"rocommunity"表示这是一个只读的访问权限,云监控只可以从您的服务器上获取信息,而不能对服务器进行任何设置。
紧接着的"sdomonitor"相当于密码,很多平台喜欢使用"public"这个默认字符串。这里的"sdomonitor"只是一个例子,您可以设置其它字符串作为密码。
最右边的"60.195.249.83"代表指定的监控点IP,这个IP地址是云监控专用的监控点,这意味着只有云监控有权限来访问您的SNMP代理程序。
所以,以上这段配置中,只有"sdomonitor"是需要您进行修改的,同时在云监控上添加服务器的时候,需要提供这个字符串。
v3
当然,我们建议您使用v3版本来进行身份验证。对于一些早期版本的Linux分发版,其内置的SNMP代理程序可能并不支持v3,所以我们建议您按照前边介绍的方法,编译和安装最新的Net-Snmp。
v3支持另一种验证方式,需要创建一个v3的帐号,我们同样修改以下配置文件:
sdo:~ # vi /usr/local/snmp/share/snmp/snmpd.conf
然后添加一个只读帐号,如下:
rouser sdomonitor auth
可以看到,在v3中,"rouser"用于表示只读帐号类型,随后的"sdomonitor"是指定的用户名,后边的"auth"指明需要验证。
接下来,我们还要添加"sdomonitor"这个用户,这就是v3中的特殊机制,我们打开以下配置文件:
sdo:~ # vi /var/net-snmp/snmpd.conf
这个文件会在snmpd启动的时候被自动调用,我们需要在它里边添加创建用户的指令,如下:
createUser sdomonitor MD5 mypassword
这行配置的意思是创建一个名为"sdomonitor"的用户,密码为"mypassword",并且用MD5进行加密传输。这里要提醒的是:
密码至少要有8个字节
这是SNMP协议的规定,如果小于8个字节,通信将无法进行。
值得注意的是,一旦snmpd启动后,出于安全考虑,以上这行配置会被snmpd自动删除,当然,snmpd会将这些配置以密文的形式记录在其它文件中,重新启动snmpd是不需要再次添加这些配置的,除非您希望创建新的用户。
以上配置中的用户名、密码和加密方式,在云监控添加服务器的时候需要添加。
启动snmp服务
$ service snmpd start
用以下命令检查服务是否启动成功
$ snmpwalk -v 2c -c sdomonitor 127.0.0.1 system
如果要关闭,则可以直接kill这个进程,如下:
$ killall -9 snmpd 或者$ service snmpd stop
⑺ linux驱动中断,程序运行几个小时后系统崩溃
中断与定时器:
中断的概念:指CPU在执行过程中,出现某些突发事件急待处理,CPU暂停执行当前程序,转去处理突发事件
,处理完后CPU又返回原程序被中断的位置继续执行
中断的分类:内部中断和外部中断
内部中断:中断源来自CPU内部(软件中断指令、溢出、触发错误等)
外部中断:中断源来自CPU外部,由外设提出请求
屏蔽中断和不可屏蔽中断:
可屏蔽中断:可以通过屏蔽字被屏蔽,屏蔽后,该中断不再得到响应
不可平布中断:不能被屏蔽
向量中断和非向量中断:
向量中断:CPU通常为不同的中断分配不同的中断号,当检测到某中断号的中断到来后,就自动跳转到与该中断号对应的地址执行
非向量中断:多个中断共享一个入口地址。进入该入口地址后再通过软件判断中断标志来识别具体哪个是中断
也就是说向量中断由软件提供中断服务程序入口地址,非向量中断由软件提供中断入口地址
/*典型的非向量中断首先会判断中断源,然后调用不同中断源的中断处理程序*/
irq_handler()
{
...
int int_src = read_int_status();/*读硬件的中断相关寄存器*/
switch(int_src){//判断中断标志
case DEV_A:
dev_a_handler();
break;
case DEV_B:
dev_b_handler();
break;
...
default:
break;
}
...
}
定时器中断原理:
定时器在硬件上也以来中断,PIT(可编程间隔定时器)接收一个时钟输入,
当时钟脉冲到来时,将目前计数值增1并与已经设置的计数值比较,若相等,证明计数周期满,产生定时器中断,并
复位计数值。
如下图所示:
Linux中断处理程序架构:
Linux将中断分为:顶半部(top half)和底半部(bottom half)
顶板部:完成尽可能少的比较紧急的功能,它往往只是简单的读取寄存器中的中断状态并清除中断标志后就进行
“登记中断”(也就是将底半部处理程序挂在到设备的底半部执行队列中)的工作
特点:响应速度快
底半部:中断处理的大部分工作都在底半部,它几乎做了中断处理程序的所有事情。
特点:处理相对来说不是非常紧急的事件
小知识:Linux中查看/proc/interrupts文件可以获得系统中断的统计信息。
如下图所示:
第一列是中断号 第二列是向CPU产生该中断的次数
介绍完相关基础概念后,让我们一起来探讨一下Linux中断编程
Linux中断编程:
1.申请和释放中断
申请中断:
int request_irq(unsigned int irq,irq_handler_t handler,
unsigned long irqflags,const char *devname,void *dev_id)
参数介绍:irq是要申请的硬件中断号
handler是向系统登记的中断处理程序(顶半部),是一个回调函数,中断发生时,系统调用它,将
dev_id参数传递给它
irqflags:是中断处理的属性,可以指定中断的触发方式和处理方式:
触发方式:IRQF_TRIGGER_RISING、IRQF_TRIGGER_FALLING、IRQF_TRIGGER_HIGH、IRQF_TRIGGER_LOW
处理方式:IRQF_DISABLE表明中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断
IRQF_SHARED表示多个设备共享中断,dev_id在中断共享时会用到,一般设置为NULL
返回值:为0表示成功,返回-EINVAL表示中断号无效,返回-EBUSY表示中断已经被占用,且不能共享
顶半部的handler的类型irq_handler_t定义为
typedef irqreturn_t (*irq_handler_t)(int,void*);
typedef int irqreturn_t;
2.释放IRQ
有请求当然就有释放了
void free_irq(unsigned int irq,void *dev_id);
参数定义与request_irq类似
3.使能和屏蔽中断
void disable_irq(int irq);//等待目前中断处理完成(最好别在顶板部使用,你懂得)
void disable_irq_nosync(int irq);//立即返回
void enable_irq(int irq);//
4.屏蔽本CPU内所有中断:
#define local_irq_save(flags)...//禁止中断并保存状态
void local_irq_disable(void);//禁止中断,不保存状态
下面来分别介绍一下顶半部和底半部的实现机制
底半部机制:
简介:底半部机制主要有tasklet、工作队列和软中断
1.底半部是想方法之一tasklet
(1)我们需要定义tasklet机器处理器并将两者关联
例如:
void my_tasklet_func(unsigned long);/*定义一个处理函数*/
DECLARE_TASKLET(my_tasklet,my_tasklet_func,data);
/*上述代码定义了名为my_tasklet的tasklet并将其余
my_tasklet_func()函数绑定,传入的参数为data*/
(2)调度
tasklet_schele(&my_tasklet);
//使用此函数就能在是当的时候进行调度运行
tasklet使用模板:
/*定义tasklet和底半部函数并关联*/
void xxx_do_tasklet(unsigned long);
DECLARE_TASKLET(xxx_tasklet,xxx_do_tasklet,0);
/*中断处理底半部*/
void xxx_do_tasklet(unsigned long)
{
...
}
/*中断处理顶半部*/
irqreturn_t xxx_interrupt(int irq,void *dev_id)
{
...
tasklet_schele(&xxx_tasklet);//调度地板部
...
}
/*设备驱动模块加载函数*/
int __init xxx_init(void)
{
...
/*申请中断*/
result = request_irq(xxx_irq,xxx_interrupt,
IRQF_DISABLED,"xxx",NULL);
...
return IRQ_HANDLED;
}
/*设备驱动模块卸载函数*/
void __exit xxx_exit(void)
{
...
/*释放中断*/
free_irq(xxx_irq,xxx_interrupt);
...
}
2.底半部实现方法之二---工作队列
使用方法和tasklet类似
相关操作:
struct work_struct my_wq;/*定义一个工作队列*/
void my_wq_func(unsigned long);/*定义一个处理函数*/
通过INIT_WORK()可以初始化这个工作队列并将工作队列与处理函数绑定
INIT_WORK(&my_wq,(void (*)(void *))my_wq_func,NULL);
/*初始化工作队列并将其与处理函数绑定*/
schele_work(&my_wq);/*调度工作队列执行*/
/*工作队列使用模板*/
/*定义工作队列和关联函数*/
struct work_struct(unsigned long);
void xxx_do_work(unsigned long);
/*中断处理底半部*/
void xxx_do_work(unsigned long)
{
...
}
/*中断处理顶半部*/
/*中断处理顶半部*/
irqreturn_t xxx_interrupt(int irq,void *dev_id)
{
...
schele_work(&my_wq);//调度底半部
...
return IRQ_HANDLED;
}
/*设备驱动模块加载函数*/
int xxx_init(void)
{
...
/*申请中断*/
result = request_irq(xxx_irq,xxx_interrupt,
IRQF_DISABLED,"xxx",NULL);
...
/*初始化工作队列*/
INIT_WORK(&my_wq,(void (*)(void *))xxx_do_work,NULL);
}
/*设备驱动模块卸载函数*/
void xxx_exit(void)
{
...
/*释放中断*/
free_irq(xxx_irq,xxx_interrupt);
...
}
⑻ 在linux下,开发trap时,终端运行时出现read_config_store open failure on /var/net-snmp/snmpapp.conf
缺少软件的配置文件snmpapp.conf,这个配置文件他原始目录下应该有个配置文件模板,把内容按你自己的需求改下然后文件名改成这个就行了,有的可能要手工建立,这要求你知道他配置文件的内容然后vi创建
⑼ Linux系统开机时启动内核步骤是什么
实模式,并开始执行位于地址0xFFFF0处
的代码,也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位
于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入到0x7C00,并开始执行此处
的代码。这就是对内核初始化过程的一个最简单的描述。
最初,linux核心的最开始部分是用8086汇编语言编写的。当开始运行时,核心将自
己装入到绝对地址0x90000,再将其后的2k字节装入到地址0x90200处,最后将核心的其余
部分装入到0x10000。
当系统装入时,会显示Loading...信息。装入完成后,控制转向另一个实模式下的汇
编语言代码boot/Setup.S。Setup部分首先设置一些系统的硬件设备,然后将核心从
0x10000处移至0x1000处。这时系统转入保护模式,开始执行位于0x1000处的代码。
接下来是内核的解压缩。0x1000处的代码来自于文件Boot/head.S,它用来初始化寄
存器和调用decompress_kernel( )程序。decompress_kernel( )程序由Boot/inflate.c,
Boot/unzip.c和Boot../misc.c组成。解压缩后的数据被装入到了0x100000处,这也是
linux不能在内存小于2M的环境下运行的主要原因。
解压后的代码在0x1010000处开始执行,紧接着所有的32位的设置都将完成: IDT、
GDT和LDT将被装入,处理器初始化完毕,设置好内存页面,最终调用start_kernel过程。
这大概是整个内核中最为复杂的部分。
[系统开始运行]
linux kernel 最早的C代码从汇编标记startup_32开始执行
startup_32:
start_kernel
lock_kernel
trap_init
init_IRQ
sched_init
softirq_init
time_init
console_init
#ifdef CONFIG_MODULES
init_moles
#endif
kmem_cache_init
sti
calibrate_delay
mem_init
kmem_cache_sizes_init
pgtable_cache_init
fork_init
proc_caches_init
vfs_caches_init
buffer_init
page_cache_init
signals_init
#ifdef CONFIG_PROC_FS
proc_root_init
#endif
#if defined(CONFIG_SYSVIPC)
ipc_init
#endif
check_bugs
smp_init
rest_init
kernel_thread
unlock_kernel
cpu_idle
・startup_32 [arch/i386/kernel/head.S]
・start_kernel [init/main.c]
・lock_kernel [include/asm/smplock.h]
・trap_init [arch/i386/kernel/traps.c]
・init_IRQ [arch/i386/kernel/i8259.c]
・sched_init [kernel/sched.c]
・softirq_init [kernel/softirq.c]
・time_init [arch/i386/kernel/time.c]
・console_init [drivers/char/tty_io.c]
・init_moles [kernel/mole.c]
・kmem_cache_init [mm/slab.c]
・sti [include/asm/system.h]
・calibrate_delay [init/main.c]
・mem_init [arch/i386/mm/init.c]
・kmem_cache_sizes_init [mm/slab.c]
・pgtable_cache_init [arch/i386/mm/init.c]
・fork_init [kernel/fork.c]
・proc_caches_init
・vfs_caches_init [fs/dcache.c]
・buffer_init [fs/buffer.c]
・page_cache_init [mm/filemap.c]
・signals_init [kernel/signal.c]
・proc_root_init [fs/proc/root.c]
・ipc_init [ipc/util.c]
・check_bugs [include/asm/bugs.h]
・smp_init [init/main.c]
・rest_init
・kernel_thread [arch/i386/kernel/process.c]
・unlock_kernel [include/asm/smplock.h]
・cpu_idle [arch/i386/kernel/process.c]
start_kernel( )程序用于初始化系统内核的各个部分,包括:
*设置内存边界,调用paging_init( )初始化内存页面。
*初始化陷阱,中断通道和调度。
*对命令行进行语法分析。
*初始化设备驱动程序和磁盘缓冲区。
*校对延迟循环。
最后的function'rest_init' 作了以下工作:
・开辟内核线程'init'
・调用unlock_kernel
・建立内核运行的cpu_idle环, 如果没有调度,就一直死循环
实际上start_kernel永远不能终止.它会无穷地循环执行cpu_idle.
最后,系统核心转向move_to_user_mode( ),以便创建初始化进程(init)。此后,进程0开始进入无限循环。
初始化进程开始执行/etc/init、/bin/init 或/sbin /init中的一个之后,系统内核就不再对程序进行直接控制了。之后系统内核的作用主要是给进程提供系统调用,以及提供异步中断事件的处理。多任务机制已经建立起来,并开始处理多个用户的登录和fork( )创建的进程。
[init]
init是第一个进程,或者说内核线程
init
lock_kernel
do_basic_setup
mtrr_init
sysctl_init
pci_init
sock_init
start_context_thread
do_init_calls
(*call())-> kswapd_init
prepare_namespace
free_initmem
unlock_kernel
execve
[目录]
--------------------------------------------------------------------------------
启动步骤
系统引导:
涉及的文件
./arch/$ARCH/boot/bootsect.s
./arch/$ARCH/boot/setup.s
bootsect.S
这个程序是linux kernel的第一个程序,包括了linux自己的bootstrap程序,
但是在说明这个程序前,必须先说明一般IBM PC开机时的动作(此处的开机是指
"打开PC的电源"):
一般PC在电源一开时,是由内存中地址FFFF:0000开始执行(这个地址一定
在ROM BIOS中,ROM BIOS一般是在FEOOOh到FFFFFh中),而此处的内容则是一个
jump指令,jump到另一个位于ROM BIOS中的位置,开始执行一系列的动作,包
括了检查RAM,keyboard,显示器,软硬磁盘等等,这些动作是由系统测试代码
(system test code)来执行的,随着制作BIOS厂商的不同而会有些许差异,但都
是大同小异,读者可自行观察自家机器开机时,萤幕上所显示的检查讯息。
紧接着系统测试码之后,控制权会转移给ROM中的启动程序
(ROM bootstrap routine),这个程序会将磁盘上的第零轨第零扇区读入
内存中(这就是一般所谓的boot sector,如果你曾接触过电脑病
毒,就大概听过它的大名),至于被读到内存的哪里呢? --绝对
位置07C0:0000(即07C00h处),这是IBM系列PC的特性。而位在linux开机
磁盘的boot sector上的正是linux的bootsect程序,也就是说,bootsect是
第一个被读入内存中并执行的程序。现在,我们可以开始来
看看到底bootsect做了什么。
第一步
首先,bootsect将它"自己"从被ROM BIOS载入的绝对地址0x7C00处搬到
0x90000处,然后利用一个jmpi(jump indirectly)的指令,跳到新位置的
jmpi的下一行去执行,
第二步
接着,将其他segment registers包括DS,ES,SS都指向0x9000这个位置,
与CS看齐。另外将SP及DX指向一任意位移地址( offset ),这个地址等一下
会用来存放磁盘参数表(disk para- meter table )
第三步
接着利用BIOS中断服务int 13h的第0号功能,重置磁盘控制器,使得刚才
的设定发挥功能。
第四步
完成重置磁盘控制器之后,bootsect就从磁盘上读入紧邻着bootsect的setup
程序,也就是setup.S,此读入动作是利用BIOS中断服务int 13h的第2号功能。
setup的image将会读入至程序所指定的内存绝对地址0x90200处,也就是在内存
中紧邻着bootsect 所在的位置。待setup的image读入内存后,利用BIOS中断服
务int 13h的第8号功能读取目前磁盘的参数。
第五步
再来,就要读入真正linux的kernel了,也就是你可以在linux的根目录下看
到的"vmlinuz" 。在读入前,将会先呼叫BIOS中断服务int 10h 的第3号功能,
读取游标位置,之后再呼叫BIOS 中断服务int 10h的第13h号功能,在萤幕上输
出字串"Loading",这个字串在boot linux时都会首先被看到,相信大家应该觉
得很眼熟吧。
第六步
接下来做的事是检查root device,之后就仿照一开始的方法,利用indirect
jump 跳至刚刚已读入的setup部份
第七步
setup.S完成在实模式下版本检查,并将硬盘,鼠标,内存参数写入到 INITSEG
中,并负责进入保护模式。
第八步
操作系统的初始化。
⑽ Linux命令行大全的目录
《linux命令行大全》
第一部分学习shell
第1章shell是什么3
1.1终端仿真器3
1.2第一次键盘输入4
1.2.1命令历史记录4
1.2.2光标移动4
1.3几个简单的命令5
1.4结束终端会话6
第2章导航7
2.1理解文件系统树7
2.2当前工作目录8
2.3列出目录内容9
2.4更改当前工作目录9
2.4.1绝对路径名9
2.4.2相对路径名9
2.4.3一些有用的快捷方式10
第3章linux系统13
3.1ls命令的乐趣13
3.1.1选项和参数14
.3.1.2进一步了解长列表格式15
3.2使用file命令确定文件类型16
3.3使用less命令查看文件内容16
3.4快速浏览18
3.5符号链接20
第4章操作文件与目录23
4.1通配符24
4.2mkdir——创建目录26
4.3cp——复制文件和目录26
4.4mv——移除和重命名文件27
4.5rm——删除文件和目录28
4.6ln——创建链接29
4.6.1硬链接29
4.6.2符号链接30
4.7实战演练30
4.7.1创建目录30
4.7.2复制文件31
4.7.3移动和重命名文件31
4.7.4创建硬链接32
4.7.5创建符号链接33
4.7.6移除文件和目录34
4.8本章结尾语35
第5章命令的使用37
5.1究竟什么是命令38
5.2识别命令38
5.2.1type——显示命令的类型38
5.2.2which——显示可执行程序的位置39
5.3获得命令文档39
5.3.1help——获得shell内置命令的帮助文档39
5.3.2help——显示命令的使用信息40
5.3.3man——显示程序的手册页40
5.3.4apropos——显示合适的命令41
5.3.5whatis——显示命令的简要描述42
5.3.6info——显示程序的info条目42
5.3.7readme和其他程序文档文件43
5.4使用别名创建自己的命令43
5.5温故以求新45
第6章重定向47
6.1标准输入、标准输出和标准错误48
6.1.1标准输出重定向48
6.1.2标准错误重定向50
6.1.3将标准输出和标准错误重定向到同一个文件50
6.1.4处理不想要的输出51
6.1.5标准输入重定向51
6.2管道53
6.2.1过滤器53
6.2.2uniq——报告或忽略文件中重复的行54
6.2.3wc——打印行数、字数和字节数54
6.2.4grep——打印匹配行54
6.2.5head/tail——输出文件的开头部分/结尾部分55
6.2.6tee——从stdin读取数据,并同时输出到stdout和文件56
6.3本章结尾语57
第7章透过shell看世界59
7.1扩展59
7.1.1路径名扩展60
7.1.2波浪线扩展61
7.1.3算术扩展61
7.1.4花括号扩展62
7.1.5参数扩展63
7.1.6命令替换64
7.2引用65
7.2.1双引号65
7.2.2单引号67
7.2.3转义字符67
7.3本章结尾语68
第8章高级键盘技巧69
8.1编辑命令行69
8.1.1光标移动70
8.1.2修改文本70
8.1.3剪切和粘贴(killing and yanking)文本71
8.2自动补齐功能71
8.3使用历史命令73
8.3.1搜索历史命令73
8.3.2历史记录扩展75
8.4本章结尾语76
第9章权限77
9.1所有者、组成员和其他所有用户78
9.2读取、写入和执行79
9.2.1chmod——更改文件模式81
9.2.2采用gui设置文件模式84
9.2.3umask——设置默认权限85
9.3更改身份87
9.3.1su——以其他用户和组id的身份来运行shell88
9.3.2sudo——以另一个用户的身份执行命令89
9.3.3chown——更改文件所有者和所属群组90
9.3.4chgrp——更改文件所属群组91
9.4权限的使用91
9.5更改用户密码93
第10章进程95
10.1进程如何工作96
10.1.1使用ps命令查看进程信息96
10.1.2使用top命令动态查看进程信息98
10.2控制进程100
10.2.1中断进程100
10.2.2使进程在后台运行101
10.2.3使进程回到前台运行101
10.2.4停止(暂停)进程102
10.3信号102
10.3.1使用kill命令发送信号到进程103
10.3.2使用killall命令发送信号给多个进程105
10.4更多与进程相关的命令105
第二部分配置与环境
第11章环境109
11.1环境中存储的是什么109
11.1.1检查环境110
11.1.2一些有趣的变量111
11.2环境是如何建立的112
11.2.1login和non-login shell112
11.2.2启动文件中有什么113
11.3修改环境114
11.3.1用户应当修改哪些文件114
11.3.2文本编辑器115
11.3.3使用文本编辑器115
11.3.4激活我们的修改117
11.4本章结尾语118
第12章vi简介119
12.1为什么要学习vi119
12.2vi背景120
12.3启动和退出vi120
12.4编辑模式121
12.4.1进入插入模式122
12.4.2保存工作122
12.5移动光标123
12.6基本编辑124
12.6.1添加文本124
12.6.2插入一行125
12.6.3删除文本126
12.6.4剪切、复制和粘贴文本127
12.6.5合并行128
12.7查找和替换128
12.7.1行内搜索128
12.7.2搜索整个文件129
12.7.3全局搜索和替换129
12.8编辑多个文件130
12.8.1切换文件131
12.8.2载入更多的文件132
12.8.3文件之间的内容复制132
12.8.4插入整个文件133
12.9保存工作134
第13章定制提示符135
13.1提示符的分解135
13.2尝试设计提示符137
13.3添加颜色138
13.4移动光标140
13.5保存提示符141
13.6本章结尾语141
第三部分常见任务和主要工具
第14章软件包管理145
14.1软件包系统146
14.2软件包系统工作方式146
14.2.1软件包文件146
14.2.2库147
14.2.3依赖关系147
14.2.4高级和低级软件包工具147
14.3常见软件包管理任务148
14.3.1在库里面查找软件包148
14.3.2安装库中的软件包148
14.3.3安装软件包文件中的软件包149
14.3.4删除软件包149
14.3.5更新库中的软件包150
14.3.6更新软件包文件中的软件包150
14.3.7列出已安装的软件包列表150
14.3.8判断软件包是否安装151
14.3.9显示已安装软件包的相关信息151
14.3.10查看某具体文件由哪个软件包安装得到151
14.4本章结尾语152
第15章存储介质155
15.1挂载、卸载存储设备156
15.1.1查看已挂载的文件系统列表157
15.1.2确定设备名称160
15.2创建新的文件系统162
15.2.1用fdisk命令进行磁盘分区162
15.2.2用mkfs命令创建新的文件系统164
15.3测试、修复文件系统165
15.4格式化软盘166
15.5直接从/向设备转移数据166
15.6创建cd-rom映像167
15.6.1创建一个cd-rom文件映像副本167
15.6.2从文件集合中创建映像文件168
15.7向cd-rom写入映像文件168
15.7.1直接挂载iso映像文件168
15.7.2擦除可读写cd-rom169
15.7.3写入映像文件169
15.8附加认证169
第16章网络171
16.1检查、监测网络172
16.1.1ping——向网络主机发送特殊数据包172
16.1.2traceroute——跟踪网络数据包的传输路径173
16.1.3netstat——检查网络设置及相关统计数据174
16.2通过网络传输文件175
16.2.1ftp——采用ftp(文件传输协议)传输文件175
16.2.2lftp——更好的ftp(文件传输协议)177
16.2.3wget——非交互式网络下载工具177
16.3与远程主机的安全通信178
16.3.1ssh——安全登录远程计算机178
16.3.2scp和sftp——安全传输文件181
第17章文件搜索183
17.1locate——较简单的方式查找文件184
17.2find——较复杂的方式查找文件185
17.2.1test选项186
17.2.2action选项190
17.2.3返回到playground文件夹194
17.2.4option选项196
第18章归档和备份197
18.1文件压缩198
18.1.1gzip——文件压缩与解压缩198
18.1.2bzip2——牺牲速度以换取高质量的数据压缩200
18.2文件归档201
18.2.1tar——磁带归档工具201
18.2.2zip——打包压缩文件205
18.3同步文件和目录207
18.3.1rsync——远程文件、目录的同步207
18.3.2在网络上使用rsync命令209
第19章正则表达式211
19.1什么是正则表达式211
19.2grep——文本搜索212
19.3元字符和文字213
19.4任意字符214
19.5锚214
19.6中括号表达式和字符类215
19.6.1否定216
19.6.2传统字符范围216
19.6.3posix字符类217
19.7 posix基本正则表达式和扩展正则表达式的比较220
19.8或选项221
19.9限定符222
19.9.1?——匹配某元素0次或1次222
19.9.2*——匹配某元素多次或零次222
19.9.3+——匹配某元素一次或多次223
19.9.4{}——以指定次数匹配某元素223
19.10正则表达式的应用224
19.10.1用grep命令验证号码簿224
19.10.2用find查找奇怪文件名的文件225
19.10.3用locate查找文件226
19.10.4利用less和vim命令搜索文本226
19.11本章结尾语227
第20章文本处理229
20.1文本应用程序230
20.1.1文件230
20.1.2网页230
20.1.3电子邮件230
20.1.4打印机输出231
20.1.5程序源代码231
20.2温故以求新231
20.2.1cat——进行文件之间的拼接并且输出到标准输出231
20.2.2sort——对文本行进行排序232
20.2.3uniq——通知或省略重复的行238
20.3切片和切块239
20.3.1cut——删除文本行中的部分内容239
20.3.2paste——合并文本行242
20.3.3join——连接两文件中具有相同字段的行243
20.4文本比较245
20.4.1comm——逐行比较两个已排序文件245
20.4.2diff——逐行比较文件246
20.4.3patch——对原文件进行diff操作248
20.5非交互式文本编辑249
20.5.1tr——替换或删除字符249
20.5.2sed——用于文本过滤和转换的流编辑器251
20.5.3aspell——交互式拼写检查工具258
20.6本章结尾语260
20.7附加项261
第21章格式化输出263
21.1简单的格式化工具264
21.1.1nl——对行进行标号264
21.1.2fold——将文本中的行长度设定为指定长度266
21.1.3fmt——简单的文本格式化工具267
21.1.4pr——格式化打印文本270
21.1.5printf——格式化并打印数据270
21.2文档格式化系统273
21.2.1roff和tex家族274
21.2.2groff——文档格式化系统274
21.3本章结尾语279
第22章打印281
22.1打印操作简史282
22.1.1灰暗时期的打印282
22.1.2基于字符的打印机282
22.1.3图形化打印机283
22.2linux方式的打印284
22.3准备打印文件284
22.3.1pr——将文本文件转换为打印文件285
22.4向打印机发送打印任务285
22.4.1lpr——打印文件(berkeley类型)286
22.4.2lp——打印文件(system v类型)287
22.4.3另外一个参数选项:a2ps287
22.5监测和控制打印任务290
22.5.1lpstat——显示打印系统状态290
22.5.2lpq——显示打印队列状态291
22.5.3lprm与cancel——删除打印任务291
第23章编译程序293
23.1什么是编译294
23.2是不是所有的程序都需要编译295
23.3编译一个c程序295
23.3.1获取源代码296
23.3.2检查源代码树297
23.3.3生成程序298
23.3.4安装程序302
23.4本章结尾语302
第四部分编写shell脚本
第24章编写第一个shell脚本305
24.1什么是shell脚本305
24.2怎样写shell脚本306
24.2.1脚本文件的格式306
24.2.2可执行权限307
24.2.3脚本文件的位置307
24.2.4脚本的理想位置308
24.3更多的格式诀窍309
24.3.1长选项名309
24.3.2缩进和行连接309
24.5本章结尾语310
第25章启动一个项目311
25.1第一阶段:最小的文档311
25.2第二阶段:加入一点数据313
25.3变量和常量314
25.3.1创建变量和常量314
25.3.2为变量和常量赋值316
25.4 here文档317
25.5本章结尾语319
第26章自顶向下设计321
26.1shell函数322
26.2局部变量325
26.3保持脚本的运行326
26.4本章结尾语328
第27章流控制:if分支语句329
27.1使用if330
27.2退出状态330
27.3使用test命令332
27.3.1文件表达式332
27.3.2字符串表达式334
27.3.3整数表达式335
27.4更现代的test命令版本336
27.5(( ))——为整数设计338
27.6组合表达式339
27.7控制运算符:另一种方式的分支341
27.8本章结尾语342
第28章读取键盘输入343
28.1read——从标准输入读取输入值344
28.1.1选项346
28.1.2使用ifs间隔输入字段347
28.2验证输入349
28.3菜单350
28.4本章结尾语351
28.5附加项352
第29章流控制:while和until循环353
29.1循环353
29.2while354
29.3跳出循环356
29.4until357
29.5使用循环读取文件358
29.6本章结尾语358
第30章故障诊断359
30.1语法错误359
30.1.1引号缺失360
30.1.2符号缺失冗余360
30.1.3非预期的展开361
30.2逻辑错误362
30.2.1防御编程363
30.2.2输入值验证364
30.3测试364
30.3.1桩365
30.3.2测试用例365
30.4调试366
30.4.1找到问题域366
30.4.2追踪366
30.4.3运行过程中变量的检验368
30.5本章结尾语369
第31章流控制:case分支371
31.1case371
31.1.1模式373
31.1.2多个模式的组合374
31.2本章结尾语375
第32章位置参数377
32.1访问命令行377
32.1.1确定实参的数目378
32.1.2shift——处理大量的实参379
32.1.3简单的应用程序380
32.1.4在shell函数中使用位置参数381
32.2处理多个位置参数381
32.3更完整的应用程序383
32.4本章结尾语386
第33章流控制:for循环389
33.1for:传统shell形式389
33.2for:c语言形式392
33.3本章结尾语393
第34章字符串和数字395
34.1参数扩展(parameter expansion)395
34.1.1基本参数396
34.1.2空变量扩展的管理396
34.1.3返回变量名的扩展397
34.1.4字符串操作398
34.2算术计算和扩展400
34.2.1数字进制401
34.2.2一元运算符401
34.2.3简单算术401
34.2.4赋值402
34.2.5位操作404
34.2.6逻辑操作405
34.3bc:一种任意精度计算语言407
34.3.1bc的使用407
34.3.2脚本例子408
34.4本章结尾语409
34.5附加项409
第35章数组411
35.1什么是数组411
35.2创建一个数组412
35.3数组赋值412
35.4访问数组元素413
35.5数组操作414
35.5.1输出数组的所有内容415
35.5.2确定数组元素的数目415
35.5.3查找数组中使用的下标416
35.5.4在数组的结尾增加元素416
35.5.5数组排序操作416
35.5.6数组的删除417
35.6本章结尾语418
第36章其他命令419
36.1组命令和子shell419
36.1.1执行重定向420
36.1.2进程替换420
36.2trap422
36.3异步执行425
36.4命名管道426
36.4.1设置命名管道427
36.4.2使用命名管道427
36.5本章结尾语428