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

Linux 操作系统编程基础知识相关推荐

  1. Linux网络编程基础知识

    Linux网络编程基础知识 1. 协议的概念 1.1 什么是协议 1.2 典型协议 2 网络应用程序设计模式 2.1 C/S模式 2.2 B/S模式 2.3 优缺点 3 分层模型 3.1 OSI七层模 ...

  2. Linux操作系统文件系统基础知识详解

    标签:基础知识操作系统根目录Linux程序 一 .Linux文件结构 文件结构是文件存放在磁盘等存贮设备上的组织方法.主要体现在对文件和目录的组织上. 目录提供了管理文件的一个方便而有效的途径. Li ...

  3. Linux操作系统编程基础

    文章目录 Linux系统开发基础 Linux系统开发概念 进程地址空间 地址空间:内核空间 VS. 用户空间 程序运行:内核态 VS. 用户态 系统调用 虚拟地址VS.物理地址 Linux应用开发环境 ...

  4. Linux操作系统汇编语言基础知识(图文代码)

    1.什么是汇编语言,它在计算机语言中的地位? 汇编语言是程序设计语言的基础语言,是唯一可以直接与计算机硬件打交道的语言 2.汇编语言与源程序.汇编程序.汇编的关系? 3.汇编语言的特点 \1) 汇编语 ...

  5. Linux——Linux C语言编程基础知识

    源程序的编译 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 通常在gcc后跟一些选项和文件名来使用gcc编译器.gcc 命令的基本用法如下:: gcc [option ...

  6. 【嵌入式Linux】嵌入式Linux应用开发基础知识之串口应用编程

    文章目录 前言 1.ARM芯片是如何使用串口发送/接收数据的 2. TTY体系中设备节点的差别 做个小实验 3.TTY驱动程序框架 4.在STM32MP157上做串口实验的准备工作 4.1.使能设备树 ...

  7. 【嵌入式Linux】嵌入式Linux应用开发基础知识之多线程编程

    文章目录 前言 1.多线程基础编程--创建线程和使用等待函数休眠线程 1.1.程序分析--使用信号量PV操作sem_wait 1.2.程序分析--使用条件变量pthread_cond_wait 2.一 ...

  8. 【嵌入式Linux】嵌入式Linux应用开发基础知识之输入系统应用编程

    文章目录 前言 1.输入系统应用编程 1.1.输入系统框架及调试 1.1.1.框架概述 1.1.2.编写APP需要的基础知识 1.2.调试技巧 1.2.1.查看设备信息 1.2.2.使用命令查看节点数 ...

  9. 嵌入式Linux开发环境搭建-4-嵌入式编程基础知识

    嵌入式Linux开发环境搭建-4-嵌入式编程基础知识 1.安装代码编辑器 2.交叉编译工作使用 1.安装代码编辑器 参考文档 ubuntu几款好用的代码编辑器_百度经验 安装sublime text ...

最新文章

  1. python 日志封装
  2. 典型环节的matlab仿真分析,典型环节的MATLAB仿真.doc
  3. MYSQL中where子句与having子句的区别
  4. java学习(67):匿名内部类
  5. 高效率人士的日常习惯
  6. kali linux u盘自启,如何实现Kali linux系统下的U盘启动(小白指导)
  7. 关于RDLC使用导出PDF文件时,中文乱码解决方案
  8. hadoop是什么_Hadoop精华问答 | hadoop能干什么?
  9. Cannot connect to the database. –Error connecting to database.
  10. sumo 仿真输出转trj文件 用于SSAM分析
  11. 计算机毕业设计Java演出票在线预定网站系统(源码+系统+mysql数据库+Lw文档)
  12. 柏云服务器点歌系统IP,阿蛮歌霸网络版点歌系统安装说明.docx
  13. Redis集群原理详解
  14. html实现pdf导出excel表格,纯前端文件导出-Excel/PDF
  15. 医院在线预约挂号系统 jsp+mysql+maven
  16. 罗永浩放话要当带货一哥,意思是要超越李佳琦了?
  17. 国庆节,一天开发一个小程序+Web系统。2.5K到手。【分享开发经验】【收藏起来】
  18. [4]Python数据类型【1】
  19. JS 判断客户端环境(以及如何区分QQ客户端和QQ浏览器)
  20. Android 圆形旋转菜单

热门文章

  1. Android实现手写板和涂鸦功能
  2. VBA基础知识整理(图象图表)
  3. linux常用-设置代理及IP
  4. 原生APP开发与WEB APP开发的区别
  5. 谷歌浏览器打开index.html原型页面axure_chrome_V0.6.3
  6. C#利用QQ游戏破解QQ密码
  7. 企业信息安全与人员管理标准
  8. vmware esxi 6-7 全套资源分享(定期更新)
  9. cropper(图片裁剪插件)
  10. Aspose.Cells - 在任何平台上操作Excel电子表格