C语言之linux、shell、vim、gcc、makefile、gdb调试

教程http://www.runoob.com/linux/linux-tutorial.html

PHP之linux使用:https://blog.csdn.net/u011146511/article/details/78408477

在Windows上安装linux;首先安装virtualbox创建虚拟机(新建---下一步-----给虚拟机分配内寸-----分配硬盘大小---),然后在virtualbox上安装centOS;

linux远程工具:secureCRTxshell,putty,ssh secure  shell client; 

 

终端输入vi,进入编辑器。vi  文件名,如果文件名不存在则表示创建文件,如果文件名存在则表示编辑文件。

命令模式下,“i”“a”“o”迚入输入模式,可以开始编辑
 输入模式下,【esc】键,进入命令模式,可以执行命令。

如退出命令模式下,”:q“退出,“:q!”强制退出,“:qw”保存后退出(修改后并保存才能退出)。

命令状态: 任何键盘输入都是命令
 命令状态: [esc] 总是回到命令状态。
编辑状态: 对文本进行编辑, 任何的输入都是编辑内容。

***在命令行模式下,/xx表示搜索xx,(“/”向后查找 ,“?”向前查找, “n”下一个)。

****环境变量:

为什么有些命令系统认识,有些命令系统不认识?因为系统通过$PATH($PATH 表示环境变量)寻找命令(可执行文件),如果找到则执行,找不到 到输出”command not found“。

查看环境变量:echo $PATH

$PATH:找寻操作系统可执行命令的路径
Linux/Unix系统下使用冒号“:”分隔路径,windows下使用分号“;”分隔路径;

whoami:显示当前系统登彔用户。

 

PATH(作用是指定命令搜索路径)、CLASSPATH(作用是指定类搜索路径,)、JAVAHOME(它指向jdk的安装目录) 的说明

  1. 1)  使 PATH 包含 JDK 安装目彔下的 bin 目彔
    目的: 将 JDK 带来的开发工具(命令)扩展到 OS 中 如: export PATH=/opt/jdk/bin:$PATH

  2. 2)  配置 JAVA_HOME, JAVA_HOME 指向 JDK 的安装目彔JAVA_HOME 的作用: 是指导"某些 Java 软件"找到 JDK如: tomcat 服务器 就使用 JAVA_HOME
    实例: export JAVA_HOME=/opt/jdk

  3. 3)  配置 CLASSPATH, 指向 Java 类的部署目彔或者 Jar 文件 用来为 JVM 指明 Java 类的搜索路径, Java 在执行类的时候 在 CLASSPATH 指示的路径下查找类文件
    实例: export CLASSPATH=.

  4. 4)  注:windows 参考 Java 配置命令
    set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_01
    set CLASSPATH=.
    set PATH=C:\Program Files\Java\jdk1.6.0_01\bin;%PATH%分号做间隔。

  5. java环境变量配置步骤:
    
    在windows桌面上右击“我的电脑” —> “属性” —> “高级” —> “环境变量”,在“系统变量”里我们可以看到系统的各个环境变量的值。双击某个变量名可以修改变量值,变量值之间用“;”隔开。我们还可以“新建”原先没有的变量。与jdk有关的有3个环境变量;“JAVA_HOME”,“PATH”,“CLASSPATH”。我的系统中“PATH”变量已经存在,可以直接添加新值(其它变量值不要动,防止其它程序运行异常),其它两个变量需要新建。
    
    CLASSPATH= .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar
    
    JAVA_HOME = C:/Program Files/Java/jdk1.5.0
    
    PATH  = %JAVA_HOME%/bin;%JAVA_HOME%/jre/bin
    https://www.cnblogs.com/zjx2711904647/p/7735556.html
    Mac系统的环境变量,加载顺序为: 
    a. /etc/profile 
    b. /etc/paths 
    c. ~/.bash_profile 
    d. ~/.bash_login 
    e. ~/.profile 
    f. ~/.bashrc 
    其中a和b是系统级别的,系统启动就会加载,其余是用户级别的。c,d,e按照从前往后的顺序读取,如果c文件存在,则后面的几个文件就会被忽略不读了,以此类推。~/.bashrc没有上述规则,它是bash shell打开的时候载入的。这里建议在c中添加环境变量,以下也是以在c中添加环境变量来演示的。
     
    
    Mac上/etc/profile环境变量设置步骤:
    sudo vim /etc/profile
    设置Home、classpath、path;
    source /etc/profile刷新生效
    
    
    .bash_profile中设置环境变量的步骤:
    open -e .bash_profile
    如果不存在.bash_profile可以使用“touch .bash_profile” 创建一个.bash_profile的隐藏配置文件;
    
    PATH="/Library/Frameworks/Python.framework/Versions/3.6/bin:${PATH}"
    export PATH=$PATH:/Users/HaokeMaster/Downloads/apache-tomcat-9.0.30/bin
    alias mysql=/usr/local/mysql/bin/mysql
    
    alias mysqladmin=/usr/local/mysql/bin/mysqladmin
    export MAVEN_HOME=/Users/HaokeMaster/Downloads/apache-maven-3.6.3
    export PATH=$PATH:$MAVEN_HOME/bin
    
    这是添加ffmpeg的环境变量,fpeg文件夹中的ffmpeg是一个可执行命令exec文件;
    export PATH=$PATH:/Users/HaokeMaster/Desktop/fpeg
    
    source .bash_profile 使配置生效

     

Windows上有系统变量和用户变量,在两个里都可以配置环境变量,一般推荐在用户变量里配置。

exportCLASSPATH=/home/liucs/demo/bin表示设置 Java 的类文件搜索路径, java 执行时候利用这个路径搜索 Java 的包和类文件 当我们设置了$CLASSPATH,在任意位置都能执行Java文件。

 

在开发过程中,如果在命令行每次都设置 CLASSPATH,未免麻烦,所以一般环境变量都在系统初 始化脚本中进行配置。

初始化脚本,是指在开机过程中自劢执行的系统脚本文件,一般用来初始化系统环境。Linux 下系统级初始化脚本文件: /etc/profile 所有当前系统的用户登录时候都执行。

 

shell:

用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。

Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。

系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Bash 也是大多数Linux 系统默认的 Shell。

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

unix使用的普通的shell,linux使用的是bash;

在windows下想要执行shell脚本,需要使用到"Git Bash",所以我们需要先安装Git。配置git环境变量.

报错.sh: Permission denied:原因是权限不够;解决:终端命令chom 777  testshell.sh。

shell执行有两种方法:./testshell.sh(注意:这里一定要用./,./表示在当前目录找,不加./就在系统或用户环境变量中找)或者chmod +x ./testshell.sh

1.变量名和等号之间不能有空格;

2.使用变量用$,可以加{};

3.使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变;readonly myUrl

4.使用 unset 命令可以删除变量;变量被删除后不能再次使用。unset 命令不能删除只读变量。unset 变量名

5.字符串可以用单引号,也可以用双引号,也可以不用引号。单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。双引号里可以有变量。双引号里可以出现转义字符。

6.原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。val=`expr 2 + 2`

注意:完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

 

 

linux的目录结构是树型结构:

查看手册:man  命令

根目录:/

/bin:可执行文件的所在目录;

/boot:内核和启动程序相关文件;

/lib:库目录,系统化最基本的动态共享库;

/media:挂载设备媒体,如U盘,光驱;

/mnt:让用户挂载别的文件系统;

/usr:很多应用会安装到这个目录,用户自己安装的程序在/usr/local;

/sbin:超级管理员执行的可执行文件,ifconfig;

/proc:这个目录是系统内存映射的目录,会保留进程运行的一些信息;

/etc:系统软件的启动和配置目录;etc/passwd,可用man 5  passwd查看文件格式;

/dev:设备文件所在目录; linux一切皆文件;

/home/user:用户的家目录;

 

ls :*代表任意多个字符,?代表任意一个字符; -R代表递归;-lrt代表按照时间排序;-a查看全部文件,文件前带 的是隐藏文件

/ 开头的是绝对路径;

cd:更换目录;

cd..  回到上一级目录;

cd - 回到上一次所在的目录;

cd ~回到家目录;cd 也可以回到家目录; cd $HOME也可以回到家目录;cd 用户名回到家目录;

sudo su 或  su -root  或sudo  -  :切换到超级管理员;

su 普通用户:切换到普通用户

exit   退回到原用户

~:家目录;

$:代表普通用户;

#:代表管理员;

pwd:显示当前的工作目录;

mkdir -p a/b  递归创建,如果不加-p,就只能创建一层文件夹;

安装tree命令:sudo apt-get install tree;

rmdir:删除目录,不能删除空目录(只有.或者..的目录);

rm:删除目录;

which:查看目录或文件的位置;

tab可以命令补齐;

 

文件操作:

touch:创建文件;touch a.txt   b.txt;如果文件不存在则创建,如果存在则只是更改访问时间;

rm: 删除 -r递归删除子目录;-f强制删除;

rm -rf* : 删除当前目录下全部内容;

cp:拷贝文件或者目录;cp 文件  目录;  

mv:移动文件或者目录;就是剪切;mv hello  aa/hello1(把hello移动到aa文件夹下命名为hello1,如果后面不佳hello,则不改名)

文件内容:

cat:查看文件内容;适合文件内容比较少;

more:查看文件内容;分屏查看;回车是逐行显示,空格是一页一页显示;

less:查看文件内容;分屏显示;回车或者上下方向键可以反复查看内容;

head:查看文件前几行;默认显示十行; head -n 5  a.cpp显示5行内容;

tail:查看文件结尾几行;默认显示十行; -f 可以一直跟踪文件结尾;

 

统计:

wc:统计行数  单词数  

wc -l 行数

wc -w单词数

wc -c字节数

du -h:显示目录占用的空间;

du -h --max-depth=1  递归一层目录;

df -h:显示当前系统空间使用情况;

 

文件属性和用户组:

ls -l  显示文件列表和信息:

drwxr-xr-x  2 HaokeMaster  staff  64  9  7 11:50 b

-rw-r--r--  1 HaokeMaster  staff  12  9  7 12:02 hello

d表示目录;-表示文件;

rwxr-xr-x指用户、用户组、其他用户权限;权限位8进制表示法:0XXX;

1是指硬连接计数;

HaokeMaster指用户;

staff指用户组;

64 目录大小字节数;

11:50目录创建时间;目录名称;

ln:建立软硬连接:

ln 源文件名 目标文件名 : 硬连接,引用的是同一个磁盘地址;

ln -s 源文件名 目标文件名  :软连接,相当于创建快捷方式;

unlink 硬连接文件名:删除硬连接;

硬连接计数为0,磁盘上的文件就被删除;

改变文件权限:chmod

chmod u/g/o/a  +/- rwx 目录或文件

u:用户

g:组

o:其他

a:所有

+:增加权限;

-:减少权限 ;

用数字的方式改变权限:0777所有权限;

who am i:显示当前用户名;

chown 用户:组  文件名或者目录    :改变用户和组;

chgrp 组  文件名或目录          :更改组;

查找:

find 目录 [选项]  要找的内容 

选项:    -name  按照名字查找

-type  按照类型查找( p管道类型   f普通类型     d目录类型) 

-type d

-size  文件按照大小查找 

-size +1M表示大于1M的文件;

-size +1M -size -5M表示大于1M小于5M的文件;

-maxdepth=1只显示一级即当前目录;find  ./  -maxdepth=1  -size +1M -size -5M

find  ./  -maxdepth=1  -size +1M -size -5M  -exec ls -l  {} \;显示详细信息;这句话的意思是把前面find查找到的结果传递给exec后面的命令;exec也可以换成ok,表示安全模式,每次都提示确认;

find ./ -type l|xargs ls -l 也可以显示详细信息;将find查找的结果分成若干块发给后面的指令;

grep过滤:find ./ -type f|grep   txt 

grep 查找的内容  目录;

grep -rn "内容"  目录:查处的结果带行号

-r :递归子目录

-n: 行号

linux中的压缩包管理:

zip:

打包:   zip -r 压缩包名字 源1 源2 

解压:unzip 压缩包名字

tar:gzip和gunzip

最常用的打包工具   .tar.gz

打包: tar zcvf  压缩包名(xx.tar.gz)   源名

解压:tar zxvf   压缩包名

-c:压缩文件

-v:显示信息

-f:指定压缩包名

-z:gz格式压缩

bzip2:和tar类似

rar:

打包:rar a  -r 压缩包名 源

解压:rar x 压缩包名  源

a表示压缩

x表示解压

 

连接到虚拟机:

桥接模式:相当于虚拟机是另外一台电脑的ip和本机电脑在同一个网段;

NAT模式:本地主机通过VMNET8网卡连接到虚拟机,要求VMNWET8的ip和虚拟机ip在同一网段;

 

linux上软件安装和卸载:

apt-get:自动安装,需要联网,

sudo apt-get update ;更新源

sudo apt-get install tree;安装tree命令

sudo apt-get  remove tree 卸载tree命令

sudo apt-get clean;清理包

 

dpkg:

安装:sudo dpkg -i 安装包

卸载:sudo dpkg -r 安装包

 

源码安装:

用户管理:https://www.runoob.com/linux/linux-user-manage.html

sudo useradd /bin/sh -g group –G adm

-s:指定shell

-g:指定组

-G 用户组 指定用户所属的附加组。

-d:用户家目录

-m:家目录不存在时,自动创建

删除用户:sudo userdel   用户名

删除用户连带删除家目录:sudo userdel -r   用户名

时间date:date +‘%Y%m%d’

echo:输出

man:查看手册

man man:总手册

alias:查看别名;在.bashrc文件中配置别名;

umask:求补码,

umask -s:显示对应的补码权限;

关机命令:

shutdown -h now  立即关机

init 0 关机

power off 关机

reboot  重启

 

VIM:

命令模式:

vim是vi的增强版;

vimtutor:vim教程;

hlkj:左右上下键

0行首

$行尾

G文件尾

gg文件头

ng到n行

u撤回

x删除光标位置的字母

X删除光标之前的字母

dw从光标所在位置开始删除单词

d$删除到文件尾部

d0删除到行首

dd删除光标所在行

ndd删除光标所在行开始的n行

yy复制一行内容

dd剪切一行内容

nyy复制n行内容

p粘贴

P粘贴

r替换光标处的字母,先输入r再输入一个字母;

进入可视模式:v  ,移动光标选中内容,y复制内容,移动光标到目的地,p/P黏贴内容;

查找: /  查找的内容     ?  查找的内容        n往下走     N往上走     光标移动到字符串上按#

vim中格式化快捷键: 

 整体格式调整gg=G     

n>>往右移动几n个tab

n<<往左移动几n个tab

选中函数名, shift+K就进入了文档;2 +K进入到头文件部分文档;

 

vi  文件 :进入命令行模式;

切换到编辑模式:

命令行进入编辑模式:

编辑模式进入命令模式:

i在光标前插入

a在光标后插入

I在行首插入

A在行尾插入

o在下一行

O在上一行

s删除光标字母变为编辑模式;

S删除当前行进入插入编辑模式;

 

末行模式:

末行模式不能和编辑模式转换;

命令模式进入末行模式:      :

:q 退出     :wq 保存退出    :q!强制退出不会保存   :w保存  :x保存退出  ZZ保存退出(在命令模式下)

末行模式进入命令模式: 两次esc;

:s a/b/g   一行中把a用b全部替换;不加g的话只替换行的第一个a;

:%s a/b/g   把所有的a用b替换;

分屏:只有末行模式才有;

横分        :sp 文件名

竖分        :vsp  文件名

退出一个文件      :q

全部文件退出     :qall

全部文件保存退出   :wqall

末行模式下执行shell命令   icommand

ctrl+W+W分屏幕切换

 

vim配置文件:

用户的配置文件      /home/用户名/.vimrc

系统的vim配置      /etc/vim/vimrc  

~/.bashrc中添加set -o vi  ,就可以在shell中使用vim的快捷键;  

 

gcc编译器:

gcc -e  hello.c  >>hello.i           (调用c++)   预处理  头文件展开  宏处理   生成.i文件

gcc  -S hello.i                             (gcc本身)   生成汇编指令.s

gcc    -c                                       (as汇编命令)   编译成.o二进制文件

gcc调用ld链接lib库                                                    连接库生成可执行文件.out

 

查看文件信息:  file  文件名

gcc add.c -I ./include/  -o ap    指定包含的路径得到可执行文件ap;

gcc add.c   -D DEBUG  -o ap         D表示指定宏

gcc add.c  -o ap  -g           g表示加上gdb调试信息

gcc add.c -lstdc++     -o ap                 编译c++代码

I  包含头文件路径

L包含库文件路径

l  库名 libxxx.so    使用-lxxx

W警告   all显示更多

c编译成.o文件

E 输出到标准输出,宏替换头文件展开

S  编译成汇编

lstdc++   编译c++代码

o    指定目标文件

g     gdb调试使用

O    优化选项1-3

 

静态库的制作:

编译为.o文件-》把所有的.o文件打包在一起,ar  rcs  静态库名.a   .o文件-》将头文件和静态库放在一起;

nm .a文件          查看文件

静态库的使用:

gcc main.c(要编译的文件)    -o   app  -I   include/(包含头文件)   -L  lib/(库文件路径)   -l cal(库文件,库文件名为libcal.so)

动态库的制作:

-fPIC 编译与位置无关性 编译为.o文件;

gcc   -fPIC   -c  *.c    

gcc   -shared  -o 动态库.so   *.o

动态库的使用:跟静态库类似.

动态库的使用需要做一些设置;

方式一:usr/lib、/lib都是放库文件的.如果库文件直接放在这两个地方,都可以被找到;

方式二:添加环境变量用:隔开; export  LD_LIBRARY_PATH=/home/hk/.../lib/:$LD_LIBRARY_PATH

方式三:etc/ld.so.conf 中可以配置库路径;  执行sudo idconfig -v;

ldd  文件         检查链接

动态库是在运行的时候加载,多个程序可以公用一个动态库;静态库是直接加到程序中,参与编译;

 

 makefile:

三要素:目标、依赖、规则命令

目标:依赖

 tab键  命令

makefile的规则:依赖的时间大于目标文件的时间则重新编译;

makefile默认编译第一个目标,如果想执行其他目标,可以指定目标make  test

变量:

Object=xxx.o           

使用:$(Object)

 

函数:

wildcard 可以进行文件匹配

获取所有的.c文件 srcFile=$(wildcard *.c)

.c文件转换成.o文件 objectFile=$(patsubst %.c,%.o,$(srcFile))

这里只目标和依赖  all:app   app1

app:$(objectFile)

 一个tab键 gcc -o app -I./include $(objectFile)

app1:$(objectFile)

 一个tab键 gcc -o app -I./include $(objectFile)

%o:%c  (这里的%代表通配)

 一个tab键 gcc -o $@ -c $< -I ./include 

test:

      @echo  $(objectFile)

.PHONY:clean all

clean:

        -@rm -f *.o

       -@rm -f app app1

$@ 代表目标

$^代表全部依赖

$<第一个依赖

$?第一个变化的依赖

 

@在规则前代表不输出该条规则命令

-代表规则报错仍然执行;

定义伪目标,防止有歧义:   .PHONY:clean

如果同时有多个makefile 可以指定:make -f  makefile(这个是要指定的makefile)

 

gdb调试:

启动gdb: gdb  app执行程序名称

r(un):启动

start: 启动,停留在main函数,分布调试

n(ext):下一步

step:下一条指令,可以进入函数内部;库函数不能进入;

设置启动参数: set args 参数一  参数二

list:显示10行代码       list 文件:行号

设置断点:b 行号         或者b   函数名   或者 b  文件名:行号

查看断点 :i(nfo) b

删除断点:d/del 断点号

下一个断点:c

查看变量的值:p(rint) 变量名

查看变量类型:ptype  变量名

设置变量的值:set     set  argc=3;

显示变量的值,用于追踪查看变量的具体什么时候变化:display

删除显示变量:undisolay

查看编号:info display

查看core文件大小: ulimit -c  ulimited

设置条件断点 b line if  i==1

core配置文件:/pro/sys/kernel/core_pattern

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值