学习任何一门学科,有清晰的思路和知识框架很重要。没有什么是一个框架图解决不了的,既清晰有明了。嗯,说正题,学习Linux也是一样的道理,上篇文章是学习Linux(red hat)基础知识的框架。这篇文章对上文的框架图进行补充,增添枝叶。
一、文件系统
1.文件类型
文件类型 | 分类 | 字符表示 | 含义 |
普通文件 |
| - | 可执行文件 |
目录文件 |
| d | 相当于windows下的文件夹 |
链接文件 |
| l | 软连接,硬链接 |
管道文件 |
| p | 进程间通讯 |
设备文件 | 块设备文件 | b | 将信息存储在固定大小的块中,每个块能独立于其它块读写。 |
字符设备文件 | c | 以不定长度的字元传送资料。 | |
套接字文件 | s | 本地套接字,网络套接字两种 |
2.根目录下子目录的含义:
/home | 所有普通目录下的家目录 |
/bin | 命令所对应的可执行文件 |
/etc | 系统的配置文件 |
/proc | 虚拟目录,内存的映射(单位是进程) |
/root | 超级管理员,root用户的家目录 |
/dev | 所有的设备文件 |
/lib | 系统使用的库文件,即静态库和共享库 |
/usr | 用户使用的资源 |
/var | 变量文件,在正常运行的系统中其内容不断变化的文件,如日志,脱机文件和临时电子邮件 |
二、基本操作
-
文件操作命令
基本操作 | 普通文件 | 目录文件 |
创建 | touch filename.name | mkdir dirname |
删除 | rm filename.name | rmdir dirname(空目录) |
rm -r dirname(非空目录) | ||
拷贝 | cp path1/filename.name path2 | cp -r path1 path2 |
剪贴 | mv path1/filename.name path2 | mv path1 path2 |
重命名 | mv path/filename.name path/new.name | Mv dirname dirnewname |
2.进程管理命令
进程管理命令 | 含义 | 用法 |
ps | 显示进程信息(PID TTY TIME CMD)[进程号 伪终端 时间 命令] | ps ps -f(显示更多信息) ps -e(系统所使用的一个进程显示) |
sleep | 睡眠 | sleep n &(表示让进程在后台睡眠n秒) sleep n (默认在前台运行) |
kill | 结束进程 | kill PTD(进程号) kill -stop PID(将进程挂起) |
pkill | 结束一组进程 | pkill CMD(命令) |
jobs | 显示进程状态和任务号[任务号 状态 命令] | jobs |
fg | 将挂起的进程或后台运行的进程放到前台运行 | fg 任务号 |
bg | 将挂起的进程放到后台运行 | bg 任务号 |
& | 将进程放到后台运行 |
|
2.用户管理
useradd | 添加用户 | Useradd -g groupname newuser(指定用户属的主组) |
Useradd -G group1,group2... Newuser(指定用户加到副组中) | ||
userdel | 删除用户 | userdel username |
usermod -g | 修改用户所属组 |
|
passwd | 修改用户密码 | passwd username |
3.文件压缩命令
方法一:(两步) |
打包:tar cfname.tar filelist 压缩:gzipname.tar |
举例:把home.c exe.txt passwd三个文件压缩为一个叫mylib的压缩包 1.tra cf mylib.tar home.c exe.txt passwd→生成mylib.tar 2.gzip mylib.tar→生成mylib.tar.gz |
方法二:(一步) |
tar zcfname.tgz filelist |
举例:tar zcf mylib.tgz home.c exe.txt passwd→mylib.tgz |
-
文件解压命令
方法一:(两步) |
解压:gzip -dname.tar.gz |
解包:tar xfname.tar |
举例:gzip -d mylib.tar.gz→生成mylib.tar tar xf mylib.tar→mylib.tar home.c exe.txt passwd |
方法二:(一步) |
解压:tar zxf name.tgz |
举例:tar xf mylib.tgz→mylib.tar home.c exe.txt passwd |
三、Linux下的C语言编程
1.编译链接:(gcc的使用)
a.编译文件:
vi或者vim 命令 -> 默认编译形成文件main.c list.c
b.链接为可执行文件
方法一:
(注:首字符“#”是系统提示符,不需要键入,下文相同)
# gcc -c main.c -> 形成main.o文件
# gcc -c list.c -> 形成list.o文件
# gcc -o tet main.o list.o ==> 链接 形成tet可执行文件
方法二
# gcc -o tet main.c list.c ==> 形成tet可执行文件
2.调试:gdb调试(对象是可执行文件)
(注:假设现在有可执行文件tet)
# gdb tet <----------启动GDB
(注:一下举例均在调试环境下进行)
(gdb)l <----------l命令相当于list,显示函数所在文件代码
(bdb)b linenum <---------将断点添加到linenum行
(gdb)b funname <----------将断点添加到funname函数的第一有效行
(gdb)info b <----------查看断点信息
(gdb)r <---------运行函数到第一个断点
(gdb)s <---------进行将要被调用的函数运行
(gdb)finish <--------退出函数运行
(gdb)n <---------执行下一行
(gdb)c <---------执行到下一个断点
(gdb)q <---------退出调试
(gdb)p <---------查看变量值
(gdb)display valname <---------监视变量valname的值
(gdb)undisplay valname <---------取消监视
(gdb)p &valname <---------查看变量valname地址
3.工程管理:makefile文件
makefile关系到整个工程的编译规则, 一个工程中的源文件不计其数,其按类型、模块、功能分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,甚至进行更复杂的功能操作。makefile也像一个Shell脚本一样,其中也可以执行操作系统命令。makefile带来的好处是--“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译。
下面举例:
有1个头文件my_math.h
#ifndef HELLO_H
#define HELLO_H
int my_add(int,int);
int my_sub(iny,int);
int my_mux(int,int);
#endif
有4个C文件,代码如下:
my_add.c文件:
#include<stdio.h>
#include"my_math.h"
int my_add(int a,int b)
{
return a+b;
}
my_sub.c文件
#include<stdio.h>
#include"my_math.h"
int my_sub(int a,int b)
{
int c;
return c=a>b?a-b:b-a;
}
my_mux.c文件:
#include<stdio.h>
#include"my_math.h"
int my_mux(int a,int b)
{
return a*b;
}
main.c文件:
#include<stdio.h>
#include"my_math.h"
{
int a=10;
int b=18;
printf("a+b=%d\n",my_add(a,b));
printf("|a-b|=%d\n",my_sub(a,b));
printf("a*b=%d\n",my_mux(a,b));
}
下面进行makefile文件编辑:
(实现名叫exe的可执行文件)
exe:main.o my_add.o my_sub.o my_mux.o
(Tab建)gcc -o exe main.o my_add.o my_sub.o my_mux.o
main.o:main.c
(Tab建)gcc -c main.c
my_add.o:my_add.c
(Tab建)gcc -c my_add.c
my_sub.o:my_sub.c
(Tab建)gcc -c my_sub.c
my_mux.o:my_mux.c
(Tab建)gcc -c my_mux.c
cleanobj:
(Tab建)rm exe *.o
现在makefile写完了,在终端上执行命令:
#make <--------可执行文件将被实现
#ls <--------显示当前目录下的文件
main.c my_math.h my_add.c my_sub.c my_mux.c exe
main.o my_add.o my_sub.o my_mux.o
#./exe <-----运行可执行文件
a+b=28
|a-b|=8
a*b=180
运行结果正确。
4.库文件:我们通常把一些公用函数制作成函数库,供其它程序使用。库函数分静态库、共享库。
a.静态库:静态库在程序编译时被链接到目标代码中,在程序运行时不需要该静态库。库的名字一般是是libXXX.a
b.动态库:在程序编译时不会链接到目标文件中,但在程序运行时被载入。库的名字一般是libXXX.so
c.举例说明:
第一步:编译得到举例的程序
程序1:hello.h为该函数库的头文件
程序2:hello.c是函数库的源程序,其中包含公用函数hello
程序3:main.c是测试库文件的主函数
程序1:hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif
程序2:hello.c
#include<stdio.h>
void hello(const char *name)
{
printf(“Hello %s\n”,name);
}
程序3:main.c
#include<stdio.h>
int main()
{
hello(“everyone!”);
exit(0);
}
第二步:在程序中使用静态库
#gcc -c hello.c <-----将源程序hello.c编译成 .o文件
#ar crv libmylib.a hello.o <-----用命令ar建立静态库文件libmyhello.a文件
#gcc -o hello main.c -L. -lmyhello <-----生成目标文件hello
#./hello
Hello everyone! <------运行结果
#
第三步:在程序中使用动态库
#gcc -shared -fPIC -o libMyhello.so hello.c <-----建立动态库文件libMyhello.a文件
#gcc -o Hello main.c -L. -lMyhello <-----生成目标文件Hello
#./Hello
./Hello:error while loading shared libraries:libMyhello.so:cannot open shared object file:No such file or directory
结果没运行出来,错误提示,找不到动态库文件libmyHello.so,原因是生成的动态库在当前文件夹下,没有载入到标准系统动态库。因此要用export命令
#export LD_LIBARAY_PATH=. <-------将环境变量设置为当前目录
#./Hello
Hello everyone! <-------运行结果
#