您的位置:首页 > 运维架构 > Linux

Linux中文件编程

2014-01-09 09:11 211 查看
Linux中文件编程的基本知识

以前看一个朋友的博客,其中有一句话很犀利:“Linux 下皆文件”,短短五个字就说出了文件系统在Linux下的重要性。在Linux操作系统中,它对一切资源的管理归根到底最后都是对文件的操作。

一.前言:

在原理课上,我们就知道操作系统的五大供能之一就是对文件的管理.

那么为什么要引入文件管理的功能呢,它的主要任务是什么呢?

我们先看看它出现的背景吧

在现代操作系统中,要利用大量的程序和数据,由于内存容量有限,且不能长期保存,于是人们想出了把这些数据以文件的形式放在外存中,需要的时候再将它们调入内存-----从此就有了文件系统。它负责管理在外存上的文件,并把对存取,共享和保护等手段提供给用户。这样就方便了用户,保证了文件的安全性,还提高了系统资源的利用率。

1.从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件的存储并对存入的文件进行保护和检索的系统。从用户的角度看,文件系统的主要目的是实现了对文件的按名存取。

2.由于要存储大量的文件,所以如何对这些文件实施有效的管理呢------>所以人们又引入了目录,通过目录来对文件进行管理。

---------------------------------------------------

现在我们来看看Linux中如何实现文件系统的。

二.Linux中的文件系统

文件系统指文件存在的物理空间,Linux 系统中每个分区都是一个文件系统,都有自己的目录层次结构。Linux 会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。

在原理课中,我们知道系统是靠FCB来管理文件的,而具体到了Linux操作系统下时,它是靠index node来管理文件的。

1.Linux中的文件系统

1>Linux是一个安全的操作系统,它是以文件为基础设计的。从此处就可以看出“Linux下皆文件”。Linux中的文件子系统主要用于管理文件存储空间的分配,文件访问权限的维护,对文件的各种操作。

a.用户可以使用shell 命令对文件进行操作,但在功能上受到一定的限制。

b.程序员可以通过系统调用或C语言的库函数对文件进行操作。

2>Linux文件主要包括两方面的内容:一是文件本身所包含的数据;另外就是文件的属性,也称为元数据,包括文件访问权限,所有者,文件大小,创建日期等。

3>目录也是一种文件,称为目录文件。目录文件的内容时该目录的目录项,目录项时该目录下的文件和目录的相关信息。当创建一个新目录时,系统将自动创建两个目录项:.和..

我们可以用命令来体验一下它的实 现:

think@ubuntu:~$ mkdir tiger

think@ubuntu:~$ ls -al tiger

drwxr-xr-x 2 think think 4096 2010-11-16 13:11 .

drwxr-xr-x 51 think think 4096 2010-11-16 13:11 ..

mkdir tiger 是创建一个tiger的目录,然后再用命令ls -al tiger来看一下tiger目录的详细信息。可以看见系统将自动创建两个目录项:. 和 ..

(如果对ls 命令不熟悉的话可以看我的小白学Linxu之常见命令有具体解释

4>Linux 采用的是标准目录结构---树型结构无论操作系统管理几个磁盘分区,这样的目录树只

有一个(这样设计的原因是为了:有助于对系统文件和不同的用户文件进行统一管理)

Tiger-John说明:

我们大加熟知的windows操作系统它是有几个分区就有几个树目录。

例如:我们有C,D,E,3个盘,那么就有3个树目录。

5>在Linux安装的时候,安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式,并指定了每个目录的作用和其中的文件类型。

a.我们还是从用命令体验以下把:

首先输入 cd /(切换到根目录下)

然后 在输入 ls (就可以看到Linux下一些主要的目录)

think@ubuntu:~$ cd /

think@ubuntu:/$ ls

bin etc initrd.img.old lost+found proc srv usr

boot home lib media root sys var

cdrom host lib32 mnt sbin think vmlinuz

dev initrd.img lib64 opt selinux tmp vmlinuz.old

b.现在看一下这些目录的功能吧

/bin 二进制可执行命令

/dev 设备特殊文件

/etc 系统管理和配置文件

/home 用户主目录的基点,比如用户user的主目录就是/home/user。

/lib 标准程序设计库,又叫动态链接共享库。

/sbin 系统管理命令,这里存放的是系统管理员使用的管理程序

/tmp 公用的临时文件存储点

/root 系统管理员的主目录

/mnt 用户临时安装其他文件系统的目录。

/proc 虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。

/var 某些大文件的溢出区,例如各种服务的日志文件

/usr 最庞大的目录,要用到的应用程序和文件几乎都在这个目录下。

Tiger-John说明:

etc针对的是系统管理员。

home是针对的是我们用户。

dev存放是设备信息。

proc存放的是内核信息

usr存放的是系统调用

2.Linux中的文件分类

1>普通文件

计算机用户和操作系统用于存放数据、程序等信息的文件。一般都长期地存放在外存储器(磁盘、磁带等)中。常规文件一般又分为文本文件和二进制文件。

2>目录文件

Linux文件系统将文件索引节点号和文件名同时保存在目录中。所以,目录文件就是将文件的名称和它的索引节点号结合在一起的一张表。目录文件只允许系统进行修改。用户进程可以读取目录文件,但不能对它们进行修改。

3>设备文件

Linux把所有的外设都当作文件来看待。每一种I/O设备对应一个设备文件,存放在/dev目录中,如行式打印机对应/dev/lp文件,第一个软盘驱动器对应/dev/fd0文件。

4>管道文件

主要用于在进程间传递数据。管道是进程间传递数据的“媒介”。某进程数据写入管道的一端,另一个进程从管道另一端读取数据。Linux对管道的操作与文件操作相同,它把管道做为文件进行处理。管道文件又称先进先出(FIFO)文件。

5>链接文件

又称符号链接文件,它提供了共享文件的一种方法。在链接文件中不是通过文件名实现文件共享,而是通过链接文件中包含的指向文件的指针来实现对文件的访问。使用链接文件可以访问常规文件,目录文件和其它文件。

那么具体在Linux中一个文件的类型都底是怎么表示的呢

来实践以下看看:

在终端输入命令: ls -l 可以看一下

--------------------------------------------------------------------------------------------

think@ubuntu:~$ ls -l

drwx------ 19 think think 4096 2010-10-30 11:28 code

-rwxr-xr-x 1 think think 1152 2010-11-01 10:22 deadlock.c

lrwxrwxrwx 1 root root 33 2010-09-17 02:23 initrd.img.old -> boot/initrd.

crw-rw-rw- 1 root root 1, 5 2010-11-16 08:59 zero

brw-rw---- 1 root disk 8, 0 2010-11-16 08:59 sda

-----------------------------------------------------------------------------------

Tiger-John 说明:

第一字母就表示了这个文件的类型:

d: 表示目录

- :表示文件

l:表示链接文件

b:表示块设备文件

c: 表示字符设备文件

p: 表示管道文件

Linux文件的访问权限及其控制

前面我们曾经说过,文件系统要实现对文件的保护,那么它是如何实现的呢?

它主要是通过对用户访问权限的控制。

现在我们再来看一下我们上次所说的通过shell命令" ls" 来查看文件的属性时所出现的一串字符代表什么意思。

drwxr-xr-x 3 root root 4096 2010-08-02 14:18 .

drwxr-xr-x 48 ryan ryan 4096 2010-08-20 17:04 ..

drwxr-xr-x 2 root root 4096 2010-08-19 21:05 tiger

[属性] [ 文件数] [ 拥有者 ] [ 用户组 ] [ 文件大小 ] [ 修改日期 ] [ 文件名 ]

1>第一项文件属性总共由10位构成,第一位表示文件类型。剩下的九位都是表示文件的访问权限,可以按照每3个一组分为3组,从左到右,第一组表示文件所有者对该文件的操作权限,第二组表示与文件所有者同组(group)的用户对该文件的操作权限,第三组表示其他用户对该文件的操作权限。每组只可能出现3种字母。

2>第二项表示文件个数。对于文件,这一项的值是1;对于目录这一项的值就是该目录中的目录文件个数(如果是空目录则系统只有默认的两个目录项:.(当前母录)和 ..(当前目录的子目录))

3>第三项表示该文件或目录的所有者

4>第四项表示文件所有者所属的组(group)

5>第五项表示文件的大小,默认为字节

6>第六项是最后一次的修改时间。以“月,日,时间“的格式表示。

7>最后一项表示文件名

--------------------------------------------

现在我们具体来说明第一项中的文件权限

一.文件权限

1. 先看一个实例

d rwx r-x r-x

[ 文件类型] [owner权限] [group权限] [other权限]

1>第一个属性,文件类型 :[d]表示目录

[-]表示文件

[l]表示链接文件

表示设备文件中可供存储的接口设备(块设备)

[c]表示设备文件中的串行端口设备

2>接下来的属性中,3个为一组,且群为rwx三个参数的组合:

[r]表示可读

[w]表示可写

[x]表示执行

3>可以用八进制数字表示每个属性,每个属性对应的数字是

r对应 4,w 对应 2 ,x 对应 1

我们可以将同一组的三个属性进行累加,例如当属性为 [-rwxrwxrwx] 则为 777.

2.那么如何通过shell 命令来更改文件权限呢

1> chgrp :改变文件所属用户组。

2> chown :改变文件拥有者。

3> chmod :改变文件的属性 , SUID 等属性。

a.chgrp [-r] groupname dirname/filename

需要注意的是,你要改成的用户组的名称,必须在 /etc/group 里存在,否则就会显示错误。(-r表示递归执行)

函数的实例:

sudo chgrp root 1

把1的用户组权限该成root

b.chown [-r] groupname dirname/filename

函数的实例:

sudo chown root 1

把1的[owner权限]该为root

c.还有一种方法也可以修改文件权限

u(用户) + (加入) r/w/x

chmod g(组) -(除去) w/r/x +file/dir

o(other) =(设置) x/r/w

a(所用用户组) + r/w/x

我们一般比较常用chmod 来该文件的权限

现在我们来体验一下:

首先 :touch tiger(创建一个tiger文件)

然后用:ls -l tiger(查看一下它的属性)

具体实现:

think@ubuntu:~/test$ touch tiger

think@ubuntu:~/test$ ls -l tiger

运行结果:

-rw-r--r-- 1 think think 0 2010-11-16 14:39 tiger

可以看到文件的属性是:用户具有读和写的权限

那么我们让用户具有执行的权限可以通过命令:chmod u+x 文件名来实现

具体实现:

think@ubuntu:~/test$ sudo chmod u+x tiger

think@ubuntu:~/test$ ls -l tiger

运行结果:

-rwxr--r-- 1 think think 0 2010-11-16 14:39 tiger

从显示的结果可以看出现在的用户具有了rwx的权限.

[b]Tiger-John说明:


我们也可以通过8进制数子来实现文件权限的修改例如:我们输入命令: sudo chmod 777 tiger

执行完后所有的用户都具有了读写执行的权限(其中 7=4+2+1,4表示r,2表示w,1表示x)所以就表示它即有读,写,执行的权限。

3.下面对setuid ,setgid,stickybit的三个权限进行说明:

1>一个文件都有一个所有者, 表示该文件是谁创建的。同时, 该文件还有一个组编号, 表示该文件所属的组, 一般为文件所有者所属的组。如果是一个可执行文件, 那么在执行时, 一般该文件只拥有调用该文件的用户具有的权限。

而setuid, setgid 可以来改变这种设置.

2>setuid ,setgid,stickybit的用法

a.setuid: 设置使文件在执行阶段具有文件所有者的权限. 典型的文件是 /usr/bin/passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权限, 从而可以更改用户的密码.

b.setgid: 该权限只对目录有效。目录被设置该位后,任何用户在此目录下创建的文件都具有和该目录所属的组相同的组。

c.sticky bit: 该位可以理解为防删除位. 一个文件是否可以被某用户删除, 主要取决于该文件所属的组是否对该用户具有写权限. 如果没有写权限, 则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件. 如果希望用户能够添加文件但同时不能删除文件, 则可以对文件使用sticky bit位. 设置该位后, 就算用户对目录具有写权限, 也不能删除该文件.

3>那么如何操作这些标志操作这些标志与操作文件权限的命令是一样的, 都是用 chmod命令。

有两种方法来操作

a.

chmod u+s tiger 表示为tiger文件加上setuid标志. (setuid 只对文件有效)

chmod g+s tigerdir 表示为tigerdir目录加上setgid标志 (setgid 只对目录有效)

chmod o+t tiger 表示为tiger文件加上sticky标志 (sticky只对文件有效)

Tiger-John说明:

setuid 只对文件有效

setgid 只对目录有效

sticky只对文件有效

b.采用八进制方式。

对一般文件通过上面所说的方法用三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志,则在这组数字之外外加一组八进制数字。如 4666, 2777等. 这一组八进制数字三位的意义如下

abc

a - setuid位, 如果该位为1, 则表示设置setuid

b - setgid位, 如果该位为1, 则表示设置setgid

c - sticky位, 如果该位为1, 则表示设置sticky

设置完这些标志后, 可以用 ls -l 来查看。如果有这些标志, 则会在原来的执行标志位置上显示。

如 rwsrw-r-- 表示有setuid标志

rwxrwsrw- 表示有setgid标志

rwxrw-rwt 表示有sticky标志

Tiger-John说明:

那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)

Linux之文件编程中软链接和硬链接的用法和区别

前言:在Linux中使用什么来识别一个文件呢?

我们先在终端上输入命令: ls -i 看看会有什么信息出现。

think@ubuntu:~$ ls -i

显示的信息

1048577 bin 523 initrd.img 524289 mnt 1 sys

1179649 boot 13 initrd.img.old 655361 opt 793170

可以看到每个文件前都有一个编号,在Linux中就是靠这个编号来识别一个文件的。

那么这些编号叫啥名字呢----》索引节点号

Tiger-John总结;

可以通过命令: ls -i来查看一个文件的索引号。

那什么叫索引节点,它有什么作用呢。

一.索引节点

Linux 文件系统使用索引节点来记录文件信息,索引节点是一个数据结构,它包含文件的长度、创建时间、修改时间、权限、所属关系、磁盘中的位置等信息。每个文件或目录都对应一个索引节点,文件系统把所有的索引节点形成一个数组,系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。文件系统正是靠这个索引节点号来识别一个文件。

我们上面提到了有一种文件是链接文件,它是干么的呢,有什么作用?

1.链接

1>什么叫链接:

对一个已经存在的文件再建立一个新的链接,而不复制文件的内容得用户无论使用哪一个文件名

都可以访问到同一文件,提高了文件的共享。

2>在Linux中有硬链接和软链接(就是我们所说的符号链接)之分。

3>硬链接(hard link)就是让一个文件对应一个或多个文件名,或者说把我们使用的文件名和文件系统使用的节点号链接起来,这些文件名可以在同一目录或不同目录。一个文件有几个文件名,我们就说该文件的链接数为几。

(硬链接就好比给文件令起了一个别名而已)

缺点:

一是不允许给目录创建硬链接。

二是只有在同一文件系统中的文件之间才能创建链接。

人们始终是在不断的追求完美,因此为了克服硬链接的缺点,----->就出现了符号链接。

4>符号链接实际上是一种特殊的文件,这种文件包含了另一个文件的任意一个路径名。这个路径名指向位于任意一个文件系统的任意文件,甚至可以指向一个不存在的文件。系统会自动把对符号链接的大部分操作(如读、写等)变为对源文件的操作,但某些操作(如删除等)就会直接在符号链接上完成。

因为符号链接实际上的存放的是一个文件的路径名,因此它可以跨目录,跨文件系统。但是这一切的优点,都是要付出巨大代价的----->软链接要新建立一个索引节点。

-----------------------------------------------------------------------------------------------------------

说了这么多我们来体验下如何用shell命令来对一个已经存在的文件建立一个链接呢?

二如何给一个文件建立一个链接

1.给一个文件建立一个硬链接

首先在终端输入命令: ln tiger.c myhlink.c

就实现了个已经存在的文件tiger.c 创建一个硬链接 myhlink.c。它们之间有什么关系呢?

(硬链接都是指向同一个文件,所以它们的索引节点号应该是相同的)

我们用命令来验证下 : ls -i 可以看看是否到底他们的索引号相同。

过程实例:

think@ubuntu:~/test$ ln tiger.c myhlink.c

think@ubuntu:~/test$ ls -i

931356 myhlink.c 931356 tiger.c

通过上面所显示的信息可以看到它们的索引号是相同的。

2.给一个文件建立一个符号链接

首先:在终端输入命令: ln -s tiger.c myslink.c

然后:输入名令: ls -i

来看看它们之间的索引号是否相同?

(因为软链接并没有指向这个文件,只是在这个文件中存了原有文件的地址,所以它们的索引号是不同的)

过程实例:

think@ubuntu:~/test$ ln -s tiger.c myslink.c

think@ubuntu:~/test$ ls -i

931346 myslink.c 931331 tiger.c

通过上面的结果可以看出它们两者的索引编号不一样。

Tiger-John总结:

1>用
shell 命令: ln filename1 filename2 可以实现给filename1 创建一个硬链接filename2。

2>
用 shell 命令:ln -s filename1
filename2 可以实现给filename1 创建一个软链接filename2。

3>
用 shell 命令: ls -i 可以查看文件的索引号

Linux文件编程之安装文件系统

前言:

可能我们机子上都按了两个操作系统Linux操作系统和XP,那么我们一般都可以在Linux下访问XP下的文件,但是我们却不能在XP下访问Linux,这是为什么呢?

一.安装文件系统

1.由于 Ext2/Ext3是 Linux 的标准文件系统,所以系统把EXT2 文件系统的磁盘分区做为系统的根文件系统,EXT2 以外的文件系统(如 Window的 FAT32 文件系统)则安装在根文件系统下的某个目录下,成为系统树型结构中的一个分枝。安装一个文件系统用 mount 命令。

2.将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为“安装(mount)”。把该子目录称为“安装点(mount point)”。

3 .文件系统创建示例

第一步:创建一个经过初始化的文件 (用 dd 命令创建一个指定大小的文件(使用 /dev/zero 作为源进行文件复制)

dd if=/dev/zero of=tiger bs=1k count=10000

过程实例:

think@ubuntu:~$ dd if=/dev/zero of=tiger bs=1k count=10000

记录了10000+0 的读入

记录了10000+0 的写出

10240000字节(10 MB)已复制,0.0890382 秒,115 MB/秒

(对dd命令不熟悉或者感兴趣的话可以看这里 )

Tiger-John说明:

把输入文件/dev/zero 拷贝到输出文件 tiger中,输入输出的块大小为 1k,总共拷贝 10000 块。

现在我们就创建了一个10MB 的 tiger文件。

第二步:使用 losetup 命令将一个循环设备与这个文件关联起来,让它看起来像一个块设备,而不是文件系统中的常规文件。(此时要使用超级权限)

sudo losetup /dev/loop0 tiger

过程实 例 :

think@ubuntu:~$ sudo losetup /dev/loop0 tiger

[sudo] password for think:

losetup: /dev/loop0: device is busy

Tiger-John 说明:

在此处使用sudo losetup /dev/loop0 命令时系统提示错误:losetup: /dev/loop0: device is busy。

说明有设备在使用 loopback 设备 ,我们可以用 /dev/loop1或 /dev/loop2来 代替 /dev/loop0,直到有一个空闲的 loopback
设备。

所以我们把命令该为 sudo losetup /dev/loop1tiger 再试一下。

过程实 例:

think@ubuntu:~$ sudo losetup /dev/loop1 tiger

[sudo] password for think

没有提示错误,说明操作成功。此时, tiger
文件现在作为一个块设备出现(由 /dev/loop1表示)

第三步: 然后用 mke2fs 在这个设备上创建一个文件系统。这个命令创建一个指定大小的新的 ext2 文件系统 。

mke2fs -c /dev/loop1 10000

表示在/dev/loop0 块设备上创建大小为10MB 的 ext2文件系统

过程实 例:

think@ubuntu:~$ sudo mke2fs -c /dev/loop1 10000

[sudo] password for think:

mke2fs 1.41.11 (14-Mar-2010)

第四步:使用 mount 命令将循环设备(/dev/loop1)所表示的 tiger 文件安装到安装点 /mnt/point1。注意,文件系统类型指定为 ext2。

mkdir /mnt/point1 表示:创建安装点

mount -t ext2 /dev/loop1  /mnt/point1:在安装点上安装 ext2 文件系统

过程实 例:

think@ubuntu:~$ sudo mkdir /mnt/point1

think@ubuntu:~$ mount -t ext2 /dev/loop1 /mnt/point1

mount: 只有 root 才能进行此操作

think@ubuntu:~$ su

root@ubuntu:/home/think# mount -t ext2 /dev/loop1 /mnt/point1

Tiger-John 说明:

mount 操作只能在root 权限下用行,所以我们用命令:su 切换到root 用户下

第五步:安装之后,就可以将这个安装点当作一个新的文件系统,比如使用 ls 命令就可以查看文件系统。

过程实例:

root@ubuntu:/home/think# ls /mnt/point1

lost+found

Tiger-John 说明:

lost+found表示新文件系统中默认的文件目录

至次一个文件系统就安装在Linux之上了。

那么我么如何卸载它呢?

第六步:我们通过命令:
umount /mnt/vfs 和
losetup -d /dev/loop0 来卸载我们刚才所加载的文件系统。


过程实例:

root@ubuntu:/home/think# umount /mnt/point1

root@ubuntu:/home/think# losetup -d /dev/loop1

root@ubuntu:/home/think# ls /mnt/point1

root@ubuntu:/home/think#

此时我们通过ls /mnt/pont1 已经看不到我们刚才的文件系统了。说明我们卸载成功

Tiger-John说明 :

从上面的学习我们学会了用shell命令来挂载自己的文件系统和卸载文件系统,那么大家有没有疑问呢?当我们在用这些shell命令时,系统到底是如何实现的呢?如过你有兴趣的话就来这里看看:http://blog.csdn.net/tigerjb/archive/2010/11/17/6015530.aspx

转自:http://blog.csdn.net/tigerjibo/article/details/6014555
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: