Linux 操作系统编程基础知识

Linux操作系统

1、Linux 操作系统编程基础知识

1.3 系统调用和库函数

1.3.1 接口
  • 命令接口:以命令形式呈现在用户面前,方便用户直接或间接控制自己的作业。
  • 程序接口:为应用程序使用系统功能而设置,是应用程序取得操作系统服务的唯一途径。由一系列系统调用组成,每一个系统调用都是一个能完成特定功能的子程序。
  • 图形接口:采用了图形化的操作界面,将各种应用程序和文件,直观、逼真地表示出来。
1.3.2 系统调用
  • 系统调用是内核提供的程序接口,是应用程序和硬件设备之间的中间层:
    • 为应用程序提供了系统服务和硬件抽象能力,例如,当需要读文件时,应用程序可以不管磁盘类型和介质,甚至不用去管文件所在的文件系统到底是那种类型
    • 系统调用保证了系统的稳定和安全
    • 每个进程都运行在虚拟系统中
  • Research UNIX系统的第7个版本提供了大给50个系统调用,4.4BSD提供了大约110个,SVR4有大约120个。Linux根据不同的版本有240到260个。
  • man 2 syscalls
  • 系统调用和C库函数之间并不是一一对应的关系,可能几个不同的函数会调用到同一个系统调用:
    • malloc函数和free函数都是通过sbrk系统调用来扩大或缩小进程的堆栈空间;
    • 在这里插入图片描述
    • execlexeclpexecleexecvexecvpexecve函数都是通过execve系统调用来执行一个可执行文件
  • 并非所有的库函数都会调用系统调用,例如,printf函数会调用write系统调用以输出一个字符串,但strcpyatoi函数则不使用任何系统调用

1.4 常用Linux命令

1.4.1 文件目录类命令
  • 命令格式:命令名称 -选项 参数
  • 例:ls -la /etc
1.4.1.0 总览
  • 浏览目录命令:lspwd
  • 目录操作命令:cdmkdirrmdir
  • 浏览文件命令:catmorelessheadtail
  • 文件操作命令:cprmmvfindgreptar
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在屏幕上同时显示文件m1m2的内容
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 总览
  • 查看系统中的进程命令:pstop
  • 控制系统中的进程命令:killkillallnicerenice
  • 进程后台运行命令:&
  • 进程的挂起和恢复

在这里插入图片描述

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、线程同步与进程间通信

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值