linux程序设计(第2版)
第2章 shell程序设计
1. 在一个脚本程序里执行另外一个脚本程序要比执行一个函数慢的多;执行结果的回传也更困难;并且可能造成小脚本过多的现象.
在linux系统中,/bin/sh命令通常只是一个到实际应用中的shell的链接.它在大部分linux系统上是一个指向/bin/bash的链接.
2. 在一台unix系统上,你永远可以保证有一个基本的shell.事实上,如果没有/bin/bash,大部分unix系统根本就不能够开机引导,更不用说让用户登录上机了.
3. 在shell脚本程序的内部我们可以执行两大类命令令,即可以在命令提示符处执行的普通命令和我们前面提到的"内建"命令."内建"命令是在shell内部实现的,不能做为外部程序被调用.大部分命令都是POSIX技术规范的组成部分,并且经常会提供有独立的对应程序.命令是内部还是外部的一般没有多大的重要性,只是内部命令执行起来效率更高.
既然提到了命令再实现的问题,我们需要了解一下UNIX怎样把一个程序用做几个命令或不同的文件.用"ls-l"命令查看一下mv,cp和ln命令,我们会发现,他们在许多系统上的实现都是同一个文件,只不过用ln命令创建录几个不同的名字而已.当这个命令被调用的时候,他会先检查自己的第一个参数---在UNIX下这将是该命令本身的名字,然后再决定将要采取什么样的动作.
4. : 冒号命令
这是一个空命令,它偶尔会被用来简化逻辑条件,相当于true的一个假名.因为它是内建的,所以它比true运行的更快,但它的可读性要差了不少.
: 还可被用来对变量进行条件化设置的情况下,比如
: ${var:=value}
如果没有":",shell会尝试把$var解释成一个命令
5. exec命令
exec有两种不同的用法(1)它经常被用来以另一个不同的程序替换掉当前的shell
(2)第二个用法是修改当前文件的描述符:exec 3 < afile
第3章 如何使用和处理文件
1. 比较重要的设备文件有3个:
(1)/dev/console设备
代表控制台
(2)/dev/tty
特殊文件/dev/tty是进程控制终端(键盘和显示屏,或者键盘和窗口)的一个假名(逻辑设备)
需要提醒大家的是,/dev/console设备只有一个,但是通过/dev/tty能够访问的物理设备却可以很多
(3)/dev/null
空(null)设备
2. 文件流与文件描述符的关系
每个文件流都和一个底层文件描述符相关联着.我们可以把底层的输入输出操作和高层的文件流操作混在一起,但一般来说这并不是明智的方法,因为它会使数据缓冲的后果难以预料.
#include <stdio.h>
int fileno(FILE*stream);
FILE*fdopen(int fileno,const char*mode);
3. 文件与子目录的维护
int chmod(const char *path,mode_t mode);
int chown(const char *path,uid_t owner,gid_t group);
int mkdir(const char *path,mode_t mode);
int rmdir(const char *path);
int chdir(const char *path);//cd 命令
int *getcwd(char *buf,size_t size);
(待续)
第2章 shell程序设计
1. 在一个脚本程序里执行另外一个脚本程序要比执行一个函数慢的多;执行结果的回传也更困难;并且可能造成小脚本过多的现象.
在linux系统中,/bin/sh命令通常只是一个到实际应用中的shell的链接.它在大部分linux系统上是一个指向/bin/bash的链接.
2. 在一台unix系统上,你永远可以保证有一个基本的shell.事实上,如果没有/bin/bash,大部分unix系统根本就不能够开机引导,更不用说让用户登录上机了.
3. 在shell脚本程序的内部我们可以执行两大类命令令,即可以在命令提示符处执行的普通命令和我们前面提到的"内建"命令."内建"命令是在shell内部实现的,不能做为外部程序被调用.大部分命令都是POSIX技术规范的组成部分,并且经常会提供有独立的对应程序.命令是内部还是外部的一般没有多大的重要性,只是内部命令执行起来效率更高.
既然提到了命令再实现的问题,我们需要了解一下UNIX怎样把一个程序用做几个命令或不同的文件.用"ls-l"命令查看一下mv,cp和ln命令,我们会发现,他们在许多系统上的实现都是同一个文件,只不过用ln命令创建录几个不同的名字而已.当这个命令被调用的时候,他会先检查自己的第一个参数---在UNIX下这将是该命令本身的名字,然后再决定将要采取什么样的动作.
4. : 冒号命令
这是一个空命令,它偶尔会被用来简化逻辑条件,相当于true的一个假名.因为它是内建的,所以它比true运行的更快,但它的可读性要差了不少.
: 还可被用来对变量进行条件化设置的情况下,比如
: ${var:=value}
如果没有":",shell会尝试把$var解释成一个命令
5. exec命令
exec有两种不同的用法(1)它经常被用来以另一个不同的程序替换掉当前的shell
(2)第二个用法是修改当前文件的描述符:exec 3 < afile
第3章 如何使用和处理文件
1. 比较重要的设备文件有3个:
(1)/dev/console设备
代表控制台
(2)/dev/tty
特殊文件/dev/tty是进程控制终端(键盘和显示屏,或者键盘和窗口)的一个假名(逻辑设备)
需要提醒大家的是,/dev/console设备只有一个,但是通过/dev/tty能够访问的物理设备却可以很多
(3)/dev/null
空(null)设备
2. 文件流与文件描述符的关系
每个文件流都和一个底层文件描述符相关联着.我们可以把底层的输入输出操作和高层的文件流操作混在一起,但一般来说这并不是明智的方法,因为它会使数据缓冲的后果难以预料.
#include <stdio.h>
int fileno(FILE*stream);
FILE*fdopen(int fileno,const char*mode);
3. 文件与子目录的维护
int chmod(const char *path,mode_t mode);
int chown(const char *path,uid_t owner,gid_t group);
int mkdir(const char *path,mode_t mode);
int rmdir(const char *path);
int chdir(const char *path);//cd 命令
int *getcwd(char *buf,size_t size);
(待续)