Linux 操作系统编程基础知识
Linux操作系统
1、Linux 操作系统编程基础知识
1.3 系统调用和库函数
1.3.1 接口
- 命令接口:以命令形式呈现在用户面前,方便用户直接或间接控制自己的作业。
- 程序接口:为应用程序使用系统功能而设置,是应用程序取得操作系统服务的唯一途径。由一系列系统调用组成,每一个系统调用都是一个能完成特定功能的子程序。
- 图形接口:采用了图形化的操作界面,将各种应用程序和文件,直观、逼真地表示出来。
1.3.2 系统调用
- 系统调用是内核提供的程序接口,是应用程序和硬件设备之间的中间层:
- 为应用程序提供了系统服务和硬件抽象能力,例如,当需要读文件时,应用程序可以不管磁盘类型和介质,甚至不用去管文件所在的文件系统到底是那种类型
- 系统调用保证了系统的稳定和安全
- 每个进程都运行在虚拟系统中
- Research UNIX系统的第7个版本提供了大给50个系统调用,4.4
BSD
提供了大约110个,SVR
4有大约120个。Linux根据不同的版本有240到260个。 - man 2
syscalls
- 系统调用和C库函数之间并不是一一对应的关系,可能几个不同的函数会调用到同一个系统调用:
malloc
函数和free
函数都是通过sbrk
系统调用来扩大或缩小进程的堆栈空间;execl
、execlp
、execle
、execv
、execvp
和execve
函数都是通过execve
系统调用来执行一个可执行文件
- 并非所有的库函数都会调用系统调用,例如,
printf
函数会调用write系统调用以输出一个字符串,但strcpy
和atoi
函数则不使用任何系统调用
1.4 常用Linux命令
1.4.1 文件目录类命令
- 命令格式:命令名称 -选项 参数
- 例:
ls -la /etc
1.4.1.0 总览
- 浏览目录命令:
ls
、pwd
- 目录操作命令:
cd
、mkdir
、rmdir
- 浏览文件命令:
cat
、more
、less
、head
、tail
- 文件操作命令:
cp
、rm
、mv
、find
、grep
、tar
1.4.1.1 浏览目录命令
1.4.1.1.1 命令名称:ls
- 命令英文原意:
list
- 功能描述:显示目录文件
- 语法
ls 选项[-ald] [文件或目录]
- -a 显示所有文件,包含隐藏文件
- -l 详细信息显示
- -d 查看目录属性
1.4.1.1.2 命令名称:pwd
- 命令英文原意:
print working directory
- 功能描述:显示当前所在的工作目录
- 语法
pwd
1.4.1.2 目录操作命令
1.4.1.2.1 命令名称:cd
- 命令英文原意:
change directory
- 功能描述:切换目录
- 语法
cd [目录]
- 例子:
$ cd /
切换到根目录$ cd ..
切换到上一级目录
1.4.1.2.2 命令名称:mkdir
- 命令英文原意:
make directory
- 功能描述:创建新目录
- 语法
mkdir [目录]
- 例子:
$ mkdir newdir
1.4.1.2.3 命令名称:rmdir
- 命令英文原意:
remove directory
- 功能描述:删除空目录
- 语法
rmdir [目录名]
- 例子:
$ rmdir newdir
1.4.1.3 浏览文件命令
1.4.1.3.1 命令名称:cat
- 命令英文原意:
concatenate and display files
- 功能描述:连接文件并打印导标准输出设备上
- 选项:
-E
在每一行的末尾显示$
-n
为显示行添加行号
- 参数:指定要连接的文件列表
- 例子:
$ cat m1
在屏幕上显示文件m1
的内容$ cat m1 m2
在屏幕上同时显示文件m1
和m2
的内容
1.4.1.3.2 命令名称:more
- 功能描述:分页显示文件内容
- 语法
more [文件名]
- (空格) 或 f 显示下一页
- (Enter) 显示下一行
- q或Q 退出
- 例子:
$ more /etc/services
less
命令的用法与more
命令类似,也可以用来浏览超过一页的文件。所不同的是less
命令除了可以按空格键向下显示文件外,还可以利用上下键来卷动文件。
1.4.1.3.3 命令名称:head
- 功能描述:用于显示文件前几行的内容
- 语法
head [参数] <文件名>
-n
显示前n行,不指定此参数显示前10行
- 例子:
[root@linux root]# head /etc/ passwd
1.4.1.3.4 命令名称:tail
- 功能描述:用于显示文件后几行的内容
- 语法
tail [参数] <文件名>
-n
显示后n行,不指定此参数显示后10行+n
从第n行显示到文件尾-F
从用于跟踪显示不断增长的文件结尾内容(通常用于显示日志文件)
- 例子:
[root@linux root]# tail /etc/ passwd
1.4.1.4 文件操作命令
1.4.1.4.1 命令名称:CP
功能描述:可以将文件从一处复制导另一处。一般在使用
cp
命令时将一个文件复制成另一个文件或复制导某目录时,需要指定源文件名与目标文件名或目录。语法
cp [参数] <源文件路径> <目标文件路径>
-p
:连同文件的属性一 起复制,而非使用默认方式,常用于备份-i
:若目标文件已经存在时,在覆盖时会先询问操作的进行-r
:递归持续复制,用于目录的复制行为-u
:目标文件与源文件有差异时才会复制
例子:
[test@linux test]$ cp test1. txt test2. txt
将test1. txt复制成test2. txt[test@linux test]$ cp test3. txt /tmp
将test3. txt复制到/ tmp目录中:[test@linux test]$ cp -r test1(目录) test2(目录)
目录拷贝
1.4.1.4.2 命令名称:rm
- 功能描述:删除文件或目录
- 语法
rm [参数] <目标文件路径>
-f
:就是force的意思,忽略不存在的文件,不会出现警告消息-i
:互动模式,在删除前会询问用户是否操作-r
:递归删除,最常用于目录删除,它是一个非常危险的参数
- 例子:
[test@linux test]$ rm myfiles (文件名)
删除某个文件[test@linux test]$ rm*
删除当前目录下的所有文件[test@linux test]$ rm -r myfolder (目录名)
递归删除某个目录(包含该目录下所有文件及子目录)[test@linux test]$ rm-f *.txt
强迫删除所有后缀名为txt文件[test@linux test]$ rm -i *
删除当前目录下的所有文件- (删除文件时会询问,可按Y或N键表示允许或拒绝删除文件)
1.4.1.4.3 命令名称:find
- 功能描述:用来寻找文件或目录
- 语法
find 路径 [参数]
-name filename
:找出文件名为filename的文件-size [+-]SIZE
:找出比SIZE还要大(+)或小(-)的文件-tpye TYPE
:查找文件的类型为TYPE的文件,TYPE的值主要有:一般文件(f)、设备文件(b、c)、目录(d)、连接文件(I)、socket (s)、FIFO管道文件§-perm mode
:查找文件权限刚好等于mode的文件,mode用数字表示,如0755
- 例子:
1.4.1.4.4 命令名称:grep
- 命令英文原意:Globally search a Regular Expression and Print
- 功能描述:在文件中搜索匹配的字符并进行输出
- 语法
grep [参数] <要找的字串> <要寻找字串的源文件>
-a
:将binary文件以text文件的方式查找数据-c
:计算找到“查找字符串”的次数-i
:忽略大小写的区别,即把大小写视为相同-v
:反向选择,即显示出不包含‘查找字符串’内容的那一行
- 例子:
1.4.1.4.5 命令名称:tar
- 命令英文原意:tape archive
- 功能描述:命令能够将用户所指定的文件或目录打包成一个文件,也可以通过指定参数开启压缩/解压缩功能
- 语法
格式: tar [参数] <文件>
-c
:新建打包文件-t
:查看打包文件的内容含有哪些文件名-x
:解打包或解压缩的功能,可以搭配-C (大写)指定解压的目录,注意-c,-t,-x不能同时出现在同一条命令中-j
:通过bzip2的支持进行压缩/解压缩-z
:通过gzip的支持进行压缩/解压缩-v
:在压缩/解压缩过程中,将正在处理的文件名显示出来-f filename
:filename为要处理的文件-C dir
:指定压缩/解压缩的目录dir
- 例子:
[root@linux test]# tar- cvf test. tar *
将当前目录的所有文件打包成test. tar[root@linux test]# tar -czvf test.tar.gz *
将当前目录的所有文件打包成test. tar,再用gzip命令压缩[root@linux ljr]# tar -tf test.tar *
查看test. tar文件中包括了哪些文件[root@linux test]# tar -xvf test.tar *
将test. tar解打包[root@linux test]# tar- xzvf foo.tar.gz *
将foo. tar. gz解压缩并解打包
1.4.2 进程控制类命令
1.4.2.0 总览
- 查看系统中的进程命令:
ps
、top
- 控制系统中的进程命令:
kill
、killall
、nice
、renice
- 进程后台运行命令:
&
- 进程的挂起和恢复
1.4.2.1 查看系统中的进程命令
1.4.2.1.1 命令名称:tar
- 功能描述:ps命令是用来显示系统瞬间的进程信息,它可以显示出在用户输入ps命令时系统的进程及进程的相关信息。
- 格式:
ps [参数]
-l
:长格式输出-u
:按用户名和启动时间的顺序来显示进程-j
:用任务格式来显示进程-f
:用树形格式来显示进程-a
:显示所有用户的所有进程(包括其它用户)-x
:显示无控制终端的进程-r
:显示运行中的进程
- 例子:
显示本用户的进程:
查看系统和每位用户全部进程:
[pp@host pp]$ ps -aux | grep pp
查找pp用户的进程
1.4.2.1.2 命令名称:top
- 功能描述:动态监视系统任务的工具,输出结果是连续的。
- 格式:
top [参数]
-b
:以批量模式运行,但不能接受命令行输入-c
:显示命令行,而不仅仅是命令名-d N
: 显示两次刷新时间的间隔,比如-d 5
,表示两次刷新间隔为5秒-i
:禁止显示空闲进程或僵尸进程-n NUM
:显示更新次数,然后退出。比如-n 5
,表示top更新5次数据就退出-p PID
:仅监视指定进程的ID,PID是一 个数值-q
:不经任何延时就刷新-s
:安全模式运行,禁用一些效互指令-S
:累积模式,输出每个进程的总的CPU时间
- 例子:
1.4.2.2 控制系统中的进程命令
1.4.2.2.1 命令名称:kill
- 功能描述:该命令用于向某个进程(通过PID标识)传送一个信号, 它通常与ps和jobs命令一起使用动态监视系统任务的工具,输出结果是连续的。
- 格式:
kill -signal PID
,常用的signal参数如下:1: SIGHUP
:启动被终止的进程2: SIGINT
:相当于输入ctrl+c,中断一个程序的进行15: SIGTERM
: 以正常的结束进程方式来终止进程17: SIGSTOP
:禁相当于输入ctrl+z,暂停一个进程的进行
- 例子:
kill -SIGTERM %1
以正常的结束进程方式来终止第一个后台工作进程kill -SIGHUP PID
重新启动进程ID为PID的进程
1.4.2.2.2 命令名称:killall
- 功能描述:killall命令使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程。使用kill命令可以杀死指定进程PID的进程,如果要根据进程名称找到需要杀死的进程,还需要在之前使用ps等命令再配合grep来查找进程而killall把这两个过程合二为一
- 格式:
killall [参数] <正在运行的进程名>
-e
:对长名称进行精确匹配-I
:忽略大小写的不同-p
:杀死进程所属的进程组-i
:交互式杀死进程,杀死进程前需要进行确认-l
:打印所有已知信号列表-q
: 如果没有进程被杀死,则不输出任何信息-r
:使用正规表达式匹配要杀死的进程名称-s
:用指定的进程号代替默认信号“SIGTERM"-u
:杀死指定用户的进程
- 例子:
[root@localhost test]# killall game
1.4.2.2.3 命令名称:nice
- 功能描述:nice 命令允许在默认优先级的基础上进行增大或减小的方式来运行命令
- 格式:
nice [参数] <command [argumenst...]>
command
:是系统中任意可执行文件的名称-n, --adjustment
:指定程序运行优先级的调整值- 优先级的调整值范围为-20 ~ 19 ,其中数值越小优先级越高,数值越大优先级越低
- 若nice命令未指定优先级的调整值,则以缺省值10来调整程序运行优先级,既在命令通常运行优先级基础之上 增加10
- 例子:
[root@host root]# nice -n -5 myprogram&
在后台以通常运行优先级-5的优先级运行myprogram
1.4.2.2.4 命令名称:renice
- 功能描述:改变一个正在运行进程的nice值
- 格式:
renice [参数] <pid>
-n
:指定程序运行优先级的调整值
- 例子:
[root@host root]# [root@host root ]# renice - -5 777
将正在运行的PID为777的进程nice值改为-5
1.4.2.3 进程后台运行命令
1.4.2.3.1 命令名称:&
- 例子:
[root@host root]# cp -r /usr/* test &
将/usr目录下的所有子目录及文件复制到/root/test目录下的工作放到后台运行
1.4.3 程序编译调试方法
1.4.3.0 总览
1.4.3.1 命令名称:gcc
功能描述:改变一个正在运行进程的nice值
格式:
gcc [选项] <文件名>
-o filename
:指定输出文件为filename。该选项不在乎gcc产生什么输出,无论是可执行文件,目标文件,汇编文件还是预处理后的C代码- 如果没有使用“-o”选项,默认的输出结果是:可执行文件为”a.out”,编译后产生的目标文件是"sourcename.0",汇编文件是“sourcename.s",而预处理后的C源代码送往标准输出
-D
:宏定义选项,等同于代码中的#define MACRO
,但-D
定义的宏作用于所有的源文件。#define PI 3.14159
如果程序用到PI则用3.14159代替gcc -D PI=3.14159 main.c
但如果没有定义宏的话,就可以直接在编译的时候赋值再运行
-l
:头文件的搜索路径,如果用户的头文件不在gcc的搜索路径中,可以用此选项指定额外搜索路径。gcc helloworld.c -I /usr/include -o helloworld
,将/usr/inlcude加入到文件头文件的搜索路径中
- 警告选项:警告是针对程序结构的诊断信息,程序不一定有错误,而是存在风险,或者可能存在错误。
- 所有以
-W
开头的选项基本上均可使用-Wno-option
来关闭该警告信息,如-Wunused
在某个局部变量除了声明就没再使用,或者声明了静态函数但是没有定义,或者某条语句的运算结果显然没有使用时,编译器就发出警告。使用-Wno-unused
可禁止该警告信息。 -w
:禁止所有警告信息Wall
:打开所有警告选项,输出警告信息- 通常建议打开
-Wall
,这样至少可以看出你的代码里有哪些地方可能存在问题
- 所有以
- 动态链接
-library
名字为library
的动态链接库。事实上此动态链接库在文件系统中的名字为liblibrary.so
。连接器会自动加上lib*.so
。-Ldir
共享库搜索目录。gcc
除了会在自定义的目录中搜索共享库外,用户也自定义目录让gcc搜索。gcc main.c -0 main -linc -L./
例子:
gcc main.c -o main
对于源代码main.c,可以通过如上命令编译成最终可执行文件(默认包含了预处理、编译、汇编及链接四个阶段)gcc -C increase.c -o increase.o
把“.c”编译成“.o”ar -r libincrease.a increase.o
把“.o”归档成静态库“.a”gcc main.c -L -static -o main
静态库和其它源文件链接成可执行文件
1.4.3.2 命令名称:gdb
- gdb是GNU计划开发的程序调试工具
- gdb可以完成以下四个方面的功能:
- 启动程序,可以按照自定义的要求随心所欲的运行程序
- 直接在shell中运行gdb命令,进入gdb界面后用file program装载程序。
- 在shell中启动gdb并加载可执行文件
gdb <program>
- 用gdb同时调试一个运行程序和core文件(core是程序非法执行后core dump后产生的文件)
gdb program core
- 调试正在运行的进程
gdb program <processid>
,进入gdb后用attach <processid>
调试正在运行的进程。
- 可让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式)
- 功能:断点设置命令break(缩写b),当gdb执行到该断点时会让程序暂停运行。此时程序员可以查看运行中程序的情况。
- 格式:
break [LOCATION] [thread THREADNUM] [if CONDITION]
[LOCATION]
linenum (行号)
function name(函数名)
filename:linenum
filename:function
class:function (c++ )
b 123 b main b increase:main b increase:123
[thread THREADNUM]
调试多线程程序时,切换到哪个线程或者在那个线程中设置断点。break frik.c:13 thread 28
[if CONDITION]
:当条件满足时,断点才生效。一般称为条件断点。CONDITION
跟C语言一样,例如b 123 if index==2
,当index为2时,程序在123行停下。
watchpoint
称为观察点,当观察对象的值有变化时,程序立即停止执行。watch <expr>
:为表达式(变量) expr设置一 个观察点。一旦表达式值有变化时,马上停住程序。rwatch <expr>
:当表达式(变量) expr被读时,停住程序。awatch<expr>
:当表达式(变量)的值被读或被写时,停住程序info watchpoints
:列出当前所设置了的所有观察点。
clear [linenum] [function name]
清除所有断点,不会清除watchpoints
。delete <num>
清除编号为num
的断点或者watchpoint
。disable <num>
禁止某个断点。enable <num>
开启某个断点。- 单步调试
step
单步调试命令,一次执行一行程序。next
单步调试命令,但跳过函数调用。finish
单步调试时直接从一个函数中返回disassemble
显示汇编代码。
- 堆栈调试
backtrace
或者bt
查看目前程序的堆栈情况。where
查看当前位置。up/down
向上或者向下移动一个堆栈。frame<num>
或者f移动到第num
个堆栈。- 当移动到某个堆栈时,便可以用gdb命令查看在那个堆栈中的局部变量。
- 启动程序,可以按照自定义的要求随心所欲的运行程序
2、文件和目录
3、进程与线程
4、线程同步与进程间通信
Linux 操作系统编程基础知识相关推荐
- Linux网络编程基础知识
Linux网络编程基础知识 1. 协议的概念 1.1 什么是协议 1.2 典型协议 2 网络应用程序设计模式 2.1 C/S模式 2.2 B/S模式 2.3 优缺点 3 分层模型 3.1 OSI七层模 ...
- Linux操作系统文件系统基础知识详解
标签:基础知识操作系统根目录Linux程序 一 .Linux文件结构 文件结构是文件存放在磁盘等存贮设备上的组织方法.主要体现在对文件和目录的组织上. 目录提供了管理文件的一个方便而有效的途径. Li ...
- Linux操作系统编程基础
文章目录 Linux系统开发基础 Linux系统开发概念 进程地址空间 地址空间:内核空间 VS. 用户空间 程序运行:内核态 VS. 用户态 系统调用 虚拟地址VS.物理地址 Linux应用开发环境 ...
- Linux操作系统汇编语言基础知识(图文代码)
1.什么是汇编语言,它在计算机语言中的地位? 汇编语言是程序设计语言的基础语言,是唯一可以直接与计算机硬件打交道的语言 2.汇编语言与源程序.汇编程序.汇编的关系? 3.汇编语言的特点 \1) 汇编语 ...
- Linux——Linux C语言编程基础知识
源程序的编译 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 通常在gcc后跟一些选项和文件名来使用gcc编译器.gcc 命令的基本用法如下:: gcc [option ...
- 【嵌入式Linux】嵌入式Linux应用开发基础知识之串口应用编程
文章目录 前言 1.ARM芯片是如何使用串口发送/接收数据的 2. TTY体系中设备节点的差别 做个小实验 3.TTY驱动程序框架 4.在STM32MP157上做串口实验的准备工作 4.1.使能设备树 ...
- 【嵌入式Linux】嵌入式Linux应用开发基础知识之多线程编程
文章目录 前言 1.多线程基础编程--创建线程和使用等待函数休眠线程 1.1.程序分析--使用信号量PV操作sem_wait 1.2.程序分析--使用条件变量pthread_cond_wait 2.一 ...
- 【嵌入式Linux】嵌入式Linux应用开发基础知识之输入系统应用编程
文章目录 前言 1.输入系统应用编程 1.1.输入系统框架及调试 1.1.1.框架概述 1.1.2.编写APP需要的基础知识 1.2.调试技巧 1.2.1.查看设备信息 1.2.2.使用命令查看节点数 ...
- 嵌入式Linux开发环境搭建-4-嵌入式编程基础知识
嵌入式Linux开发环境搭建-4-嵌入式编程基础知识 1.安装代码编辑器 2.交叉编译工作使用 1.安装代码编辑器 参考文档 ubuntu几款好用的代码编辑器_百度经验 安装sublime text ...
最新文章
- python 日志封装
- 典型环节的matlab仿真分析,典型环节的MATLAB仿真.doc
- MYSQL中where子句与having子句的区别
- java学习(67):匿名内部类
- 高效率人士的日常习惯
- kali linux u盘自启,如何实现Kali linux系统下的U盘启动(小白指导)
- 关于RDLC使用导出PDF文件时,中文乱码解决方案
- hadoop是什么_Hadoop精华问答 | hadoop能干什么?
- Cannot connect to the database. –Error connecting to database.
- sumo 仿真输出转trj文件 用于SSAM分析
- 计算机毕业设计Java演出票在线预定网站系统(源码+系统+mysql数据库+Lw文档)
- 柏云服务器点歌系统IP,阿蛮歌霸网络版点歌系统安装说明.docx
- Redis集群原理详解
- html实现pdf导出excel表格,纯前端文件导出-Excel/PDF
- 医院在线预约挂号系统 jsp+mysql+maven
- 罗永浩放话要当带货一哥,意思是要超越李佳琦了?
- 国庆节,一天开发一个小程序+Web系统。2.5K到手。【分享开发经验】【收藏起来】
- [4]Python数据类型【1】
- JS 判断客户端环境(以及如何区分QQ客户端和QQ浏览器)
- Android 圆形旋转菜单