Linux C编程之二:Linux基础

Posted 留下的只是回忆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux C编程之二:Linux基础相关的知识,希望对你有一定的参考价值。

1、Linux的特点

  (1)Linux就是一个操作系统(作为用户和计算机之间接口的软件程序)

    注:操作系统的功能:命令解释,进程管理,内存管理,输入输出(I/O)操作和外围设备管理,文件管理

  (2)特点:具有贵族血统

    开放性,多用户,多任务,出色的稳定性和速度性能,丰富的网络性能,可靠的系统安全,可移植性(适合大多数计算机平台)

  (3)linux关机方法

  

2、Linux系统结构

  硬件 > 内核 > 接口(shell)> 外层应用程序

3、Linux的目录结构

  

  存放命令的目录 :/bin   /sbin  /usr/bin   /usr/sbin   /usr/local/bin

  /boot  内核及其他系统启动所需要的文件

  /opt  安装大的应用程序

  /lost+dound  系统修复过程中回复的文件

 

  /dev  放置设备文件

    

       

  /etc  配置文件所在目录

    

    /etc.inittab

      

  

  /home  用户主目录

用户的默认主目录 /home/username
useradd username  创建新用户
passwd username  添加密码

    

  /lib  库文件目录

/lib 系统所用的库,如C程序库
/lib.modules/2.4.20-8/lernel/drivers(驱动库)
/usr/lib/  应用程序使用的库,如mysql的API

  /mnt  装载目录

    光驱的装载:mount -t 文件类型 设备文件 挂载目录

mount -t ios9660 /dev/cdrom /mnt/cdrom

    光驱的卸载:

umount /mnt/cdrom

  /usr 用户目录 

    /user/doc    /usr/share/doc帮助文档

    man   查看命令的手册页

    info  查看命令的帮助

    命令 -help

/user/src/linux-2.4.20-8/    存放linux的源代码

4、了解所用硬盘的信息

mount   所挂载分区
fdisk -l [/dev/had]    硬盘分区状况
fd -h   硬盘分区的使用情况  
du -sh    目录占用空间
uname -a   所用linux的版本号

5、文件操作命令

mkdir  创建目录
rm -r -f   递归删除目录,并不提示
rmdir   删除空目录
pwd   查看当前目录
cd    切换目录

  

more/less   查看文件内容
cat  显示所指文件的内容
mv(move)  移动文件或文件夹
cp(copy)【-f(force)直接覆盖;-I 提示是否覆盖;-r 递归】  复制文件或文件夹

6、文件的类型

  (1)普通文件(-):文本文件和二进制文件

  (2)目录文件(d):文件夹

  (3)链接文件(l):ln创建的文件

  (4)特殊文件:

ls -l  可以看到文件的类型

  当系统非正常关机,可能无法进入系统,这是可以执行fsck修复磁盘

fsck [选项] <设备名>
如:fsck -p -l ext2 /dev/hda2

7、文件的查找与比较

  (1)文件的查找:find,grep命令

find 路径 [选项]
如:find /etc -name passwd
        -size  按文件大小查找
        -type 按文件类型查找

locate

grep [选项] 查找模式 文件名[文件名....]  在文件里面查找符合某个查找模式的字符串
    -n 显示匹配行号
    -l 忽略大小写
    -r 递归查找

  (2)文件的比较:diff,cmp命令

diff  找出两个文本文件的差异
    diff [参数] <file><file>
        -w  忽略空格差别
        -I  忽略大小写


cmp  比较任意两个文件
    cmp [参数] <file><file>

 

8、文件目录的权限

  (1)linux用户类型:系统管理员(root),文件拥有者(u),组拥有者(g),其他用户(o)

  (2)改变文件访问权限:chmod命令

符号标记法,如:
  chmod g+w o-x /usr/local/*

数字标记法,如:
  chmod 755 /usr/local/*

9、硬连接与符号链接

  在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。

  链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(Symbolic link)。

  (1)、硬链接

    硬链接说白了是一个指针,指向文件索引节点,系统并不为它重新分配inode。可以用:ln命令来建立硬链接。语法:

<ccid_code>ln [options] existingfile newfile
ln[options] existingfile-list directory

    用法: 第一种:为”existingfile”创建硬链接,文件名为”newfile”。第二种:在”directory”目录中,为”existingfile-list”中包含的所有文件创建一个同名的硬链接。常用可选  [options] –f 无论”newfile”存在与否,都创建链接。-n 如果”newfile”已存在,就不创建链接。

    下面举一些例子:

<ccid_code>$ ls –il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 1 longcheng longcheng 57 8月 5 16:40 file2
$ ln file2 file2hard
$ ls –il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard

    注意在创建链接前,file1 显示的链接数目为1,创建链接后(1)file1和file1hard的链接数目都变为2;(2) file1和file1hard在inode号是一样的(3) file1和file1hard显示的文件大小也是一样。可见进行了ln命令的操作结果:file1和file1hard是同一个文件的两个名字,它们具有同样的索引节点号和文件属性,建立文件file1的硬链接,就是为file1的文件索引节点在当前目录上建立一个新指针。如下图,你可以删除其中任何一个,如rm file2 ,每次只会删除一个指针,

    链接数同时减一,只有将所有指向文件内容的指针,也即链接数减为0时,内核才会把文件内容从磁盘上删除。当前目录逻辑结构:(不好意思图没有显示出来)。

    还可以在不同目录,但同一文件系统中建立文件的硬链接。设file1、file2在目录/home/longcheng/dir1中,下面的命令,在/home/longcheng中建立file2的硬链接。

<ccid_code>ln file2 /home/longcheng/file2hard

    下面的程序,是将dir1目录中所有文件,在目录dir2中建立硬链接

<ccid_code>$mkdir dir2
$ln /home/longcheng/dir1/* /home/longcheng/dir2

    如果使用了 ln –f existingfile newfile,如果newfile已经存在,则无论原来newfile是什么文件,只用当前用户对它有写权限,newfile就成为exisitngfile的硬链接文件。

    尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一下不足之处:(1)不可以在不同文件系统的文件间建立链接(2)只有超级用户才可以为目录创建硬链接。虽然很多树上说root用户可以创建,但是笔者在学习过程中发现即使是root用户也不能创建,我的系统是Redhat,内核2.4、2.6都试过,在其他系统中不知道是不是可以。

  (2)、软链接(符号链接)

    符号链接是对一个文件的间接指针。硬链接直接指向文件的i节点。

    软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。

    建立软链接,只要在ln后面加上选项 –s,下面举个例子

<ccid_code>$ ls -il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard
$ln –s file1 file1soft
$ls -il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard
13061 lrwxrwxrwx 1 longcheng longcheng 5 8月 5 16:58 file1soft->file1

    从上面链接后的结果可以看出来软链接与硬链接,区别不仅仅是在概念上,在实现上也是不同的。区别:硬链接原文件&链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件&链接文件拥有不同的inode号,表明他们是两个不同的文件;在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;链接数目是不一样的,软链接的链接数目不会增加;文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的,这用强调,因为是等同的嘛,而这里软链接显示的大小与原文件就不同了,file1大小是48B,而file1soft是5B,这里面的5实际上就是“file1”的大小。

    总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。

10、重定向

  Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作。

  (1)输入重定向 

    格式:command-line1 [1-n] > file或文件操作符或设备

    上面命令意思是:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)  重定向其它输出设备(文件,打开文件操作符,或打印机等等)1,2分别是标准输出,错误输出。

    实例:

#显示当前目录文件 test.sh test1.sh test1.sh实际不存在
[chengmo@centos5 shell]$ ls test.sh test1.sh
ls: test1.sh: 没有这个文件和目录
test.sh
 
#正确输出与错误输出都显示在屏幕了,现在需要把正确输出写入suc.txt
# 1>可以省略,不写,默认所至标准输出
[chengmo@centos5 shell]$ ls test.sh test1.sh 1>suc.txt
ls: test1.sh: 没有这个文件和目录
[chengmo@centos5 shell]$ cat suc.txt 
test.sh
 
#把错误输出,不输出到屏幕,输出到err.txt
[chengmo@centos5 shell]$ ls test.sh test1.sh 1>suc.txt 2>err.txt
[chengmo@centos5 shell]$ cat suc.txt err.txt 
test.sh
ls: test1.sh: 没有这个文件和目录
#继续追加把输出写入suc.txt err.txt  “>>”追加操作符
[chengmo@centos5 shell]$ ls test.sh test1.sh 1>>suc.txt 2>>err.txt 
 
#将错误输出信息关闭掉
[chengmo@centos5 shell]$ ls test.sh test1.sh 2>&-
test.sh
[chengmo@centos5 shell]$ ls test.sh test1.sh 2>/dev/null
test.sh
#&[n] 代表是已经存在的文件描述符,&1 代表输出 &2代表错误输出 &-代表关闭与它绑定的描述符
#/dev/null 这个设备,是linux 中黑洞设备,什么信息只要输出给这个设备,都会给吃掉 
 
#关闭所有输出
[chengmo@centos5 shell]$ ls test.sh test1.sh  1>&- 2>&- 
#关闭 1 ,2 文件描述符
[chengmo@centos5 shell]$ ls test.sh test1.sh  2>/dev/null 1>/dev/null
#将1,2 输出转发给/dev/null设备 
[chengmo@centos5 shell]$ ls test.sh test1.sh >/dev/null 2>&1
#将错误输出2 绑定给 正确输出 1,然后将 正确输出 发送给 /dev/null设备  这种常用
<p>[chengmo@centos5 shell]$ ls test.sh test1.sh &>/dev/null
#& 代表标准输出 ,错误输出 将所有标准输出与错误输出 输入到/dev/null文件

  注意:

    1、shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件。不存在直接创建。 无论左边命令执行是否成功。右边文件都会变为空。

    2、“>>”操作符,判断右边文件,如果不存在,先创建。以添加方式打开文件,会分配一个文件描述符[不特别指定,默认为1,2]然后,与左边的标准输出(1)或错误输出(2) 绑定。

    3、当命令:执行完,绑定文件的描述符也自动失效。0,1,2又会空闲。

    4、一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符。

    5、一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行

  (2)输出重定向

    格式:command-line [n] <file或文件描述符&设备

    将然有,命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入。执行这个命令,将标准输入0,与文件或设备绑定。将由它进行输入。

    实例:

[chengmo@centos5 shell]# cat > catfile 
testing 
cat file test
#这里按下 [ctrl]+d 离开 
#从标准输入【键盘】获得数据,然后输出给catfile文件
 
[chengmo@centos5 shell]$ cat>catfile <test.sh
#cat 从test.sh 获得输入数据,然后输出给文件catfile
 
 
[chengmo@centos5 shell]$ cat>catfile <<eof
test a file
test!
eof
 
#<< 这个连续两个小符号, 他代表的是『结束的输入字符』的意思。这样当空行输入eof字符,输入自动结束,不用ctrl+D

  (3)错误重定向

    格式:exec 文件描述符[n] <或> file或文件描述符或设备

    在上面讲的输入,输出重定向 将输入,输出绑定文件或设备后。只对当前那条指令是有效的。如果需要在绑定之后,接下来的所有命令都支持的话。就需要用exec命令

    实例:

[chengmo@centos5 shell]$ exec 6>&1
#将标准输出与fd 6绑定
 
[chengmo@centos5 shell]$ ls  /proc/self/fd/ 
0  1  2  3  6
#出现文件描述符6
 
[chengmo@centos5 shell]$ exec 1>suc.txt
#将接下来所有命令标准输出,绑定到suc.txt文件(输出到该文件)
 
[chengmo@centos5 shell]$ ls -al
#执行命令,发现什么都不返回了,因为标准输出已经输出到suc.txt文件了
 
[chengmo@centos5 shell]$ exec 1>&6
#恢复标准输出
 
 
[chengmo@centos5 shell]$ exec 6>&-
#关闭fd 6描述符
 
[chengmo@centos5 ~]$ ls /proc/self/fd/
0  1  2  3

  说明:使用前先将标准输入保存到文件描述符6,这里说明下,文件描述符默认会打开0,1,2 还可以使用自定义描述符 。然后对标准输出绑定到文件,接下来所有输出都会发生到文件。 使用完后,恢复标准的输出,关闭打开文件描述符6。

  • 复杂一点实例
    exec 3<>test.sh;
    #打开test.sh可读写操作,与文件描述符3绑定
     
    while read line<&3
     do
        echo $line;
    done
    #循环读取文件描述符3(读取的是test.sh内容)
    exec 3>&-
    exec 3<&-
    #关闭文件的,输入,输出绑定
    

    其实,总结一下,重定向应用通常就以下两点:

      1、重新设置命令的默认输入,输出,指向到自己文件(文件,文件描述符,设备其实都是文件,因为linux就是基于设备也是文件,描述符也指向是文件)

          2、扩展自己新的描述符,对文件进行读写操作

11、网络主要命令

ifconfig
ping
route -n
netstat

12、文件分发格式

  (1)tar包

  (2)rpm包

rpm -ivh rpm包       安装rpm包
rpm -Uvh rpm包     升级rpm包
rpm -e rpm包      删除rpm包
rpm -qi 包名    查询rpm包的信息
rpm -pf "which命令"    显示命令所在包
rpm -ql  包名称  列出包中的文件列表

  (3)dpkg包

以上是关于Linux C编程之二:Linux基础的主要内容,如果未能解决你的问题,请参考以下文章

Yuchuan_Linux_C编程之二 GCC编译

Linux系统裁剪之二(Bash脚本编程之十二)

散打Linux基础教程之二:Vim编辑器的使用

散打Linux基础教程之二:Vim编辑器的使用

Linux 线程编程之二

Linux C与C++一线开发实践之二 Linux文件系统