
Linux基础入门篇我最近在学习Linux操作系统本文章只作为老师给的实验报告的记录便于回顾复习。指令作用小白解释Ctrl Alt T打开 Ubuntu 终端相当于打开命令行窗口nano cpu_check.sh创建/编辑脚本文件用 nano 文本编辑器打开文件Ctrl O保存在 nano 里按然后回车确认Ctrl X退出 nano保存后退出编辑器chmod x cpu_check.sh给脚本加可执行权限不加会提示 Permission denied./cpu_check.sh运行当前目录下的脚本./表示“当前目录”bash cpu_check.sh用 bash 运行脚本没有执行权限时也可以这样运行psprocess status查看进程类似 Windows 任务管理器ps aux查看所有进程的详细信息格式较稳定推荐使用ps -eo pid,pcpu,comm自定义显示 PID、CPU%、命令不同系统下容易列错位实验里踩坑了--sort-%cpu按 CPU 使用率降序排序-表示从高到低|管道把前一个命令的结果交给后一个命令处理awk文本处理工具按列筛选、打印数据echo输出文字可以打印表头实验报告一在Linux内核中编写.sh脚本完成以下任务在终端中输出CPU使用率大于0.0%的进程。#!/bin/bashechoPID CPU% COMMANDpsaux--sort%cpu|awkNR1 $30.0{print $2,$3,$11}#!/bin/bash叫‘shebang’告诉系统该脚本用/bin/bash,#!后面一般不要空格。echo PID CPU% COMMAND输出一行表头让结果更清楚。ps aux --sort-%cpups aux列出所有进程。aux是ps的三个选项合在一起写a显示所有终端上的进程包括其他用户的进程。u用“用户友好”的格式显示会多出用户名、CPU、内存等信息。x显示没有控制终端的进程比如一些后台服务。所以ps aux的意思就是列出系统里所有进程的详细信息。输出大概长这样USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 168520 13112 ? Ss 09:00 0:02 /sbin/init kian 3482 3.8 0.2 123456 23456 ? Sl 09:10 0:15 gnome-shell其中PID进程号。%CPUCPU 使用率。COMMAND进程命令名。--sort表示“按某个字段排序”。-%cpu表示按 CPU 使用率排序。前面的-号表示降序也就是从高到低排。所以--sort-%cpu的意思是按照 CPU 使用率从高到低排序。如果写成--sort%cpu就是升序从低到高排一般不这么用。注意必须写成--sort-%cpu等号不能丢否则会报错error: long sort specification must follow --sort。| awk ...|是管道把ps的输出交给awk处理。awk是 Linux 里专门用来处理文本的工具它最擅长按行读取。按列拆分。筛选符合条件的行。打印指定列。ps aux的输出是很多行、很多列的文字所以很适合用awk来处理。awk NR1 $30.0 {print $2, $3, $11}这是核心整个awk程序写在单引号 里面结构是条件 { 动作 }也就是如果满足条件就执行动作。这里NR1 $30.0是条件{print $2, $3, $11}是动作。NR1NR是awk的内置变量表示当前处理到第几行。ps aux的输出第一行是表头不是真正的进程所以要跳过它。NR1的意思就是只处理第 2 行及以后的行跳过第 1 行表头。$30.0在awk里$1表示第 1 列$2表示第 2 列$3表示第 3 列以此类推。ps aux的列大概是这样列号含义$1USER用户名$2PID进程号$3%CPUCPU 使用率$4%MEM内存使用率$5VSZ虚拟内存$6RSS物理内存$7TTY终端$8STAT状态$9START启动时间$10TIMECPU 时间$11COMMAND命令名所以$30.0的意思就是第 3 列也就是 CPU 使用率必须大于 0.0这样就把 CPU 使用率为 0.0 的进程过滤掉了。是逻辑“并且”。所以NR1 $30.0的意思是当前行不是表头并且 CPU 使用率大于 0.0两个条件都满足才会执行后面的动作。{print $2, $3, $11}print是打印输出这里打印三列$2PID进程号、$3%CPUCPU 使用率、$11COMMAND命令名。中间的逗号,表示打印时用空格隔开。所以{print $2, $3, $11}的意思就是输出 PID、CPU%、命令名。实验报告二在练习课件中的fork、exec系统调用后编写C语言程序完成以下任务1在ex2.c程序的执行进程中打印ex1.c中定义的字符串语句2调用相关系统调用完成任意一个内排序算法。ex1.c#includestdio.hintmain(){printf(wo yao kao ke ruan!);return0;}ex2.c#includestdio.h#includestdlib.h#includeunistd.h#includesys/types.h#includesys/wait.h//BubbleSortvoidBubbleSort(intarr[],intn){inti,j,temp;for(in-1;i0;i--){for(j0;jn-1-j;j){if(a[j]a{j1}){tempa[j1];a[j1]a[j];a[j]temp;}}}}intmain(){pid_tpid;pidfork();if(pid0){perror(Fork failed);return1;}elseif(pid0){//child processexcel(./q1f1,q1f1,NULL);//if failedperror(Excel failed);exit(1);}else{//parent proocess:waiting for the child process complete excutionprintf(child process is finished.);//q2intarr[]{22,33,44,55,66,77,88,99};intnsizeof(arr)/sizeof(arr[0]);printf(array before sorting:\n);for(inti0;in;i){printf(%d,arr[i]);}printf(\n);BubbleSort(arr,n);printf(array after sorting:\n);for(inti0;in;i){printf(%4d,arr[i]);}}printf(\n);wait(NULL);printf(\nparent process is finished.);}执行操作 在Ubuntu终端先编译ex1.c文件输入gcc ex1.c -o ex1编译成功后再编译ex2.c文件输入gcc ex2.c -o ex2输入./ex2(注./中不要存在空格。在 Linux 中./代表当前目录。如果./和程序名之间有空格系统会以为你要执行“当前目录”这个文件夹)核心思路通过fork()产生一个子进程父进程在后台执行冒泡排序业务逻辑子进程通过exec()执行另一个程序打印字符串系统调用的验证父子进程的并发进行充分体现了操作系统的进程调度。核心知识点1. fork() —— 克隆一个分身执行到这一行系统会凭空多出一个一模一样的进程。pid 0 : 创建失败(一般不会发生pid 0 : 表示在子进程里pid 0 : 表示在父进程里2. execl() —— 夺舍替换进程把当前进程的“灵魂”替换成另一个程序。execl(“./ex1”, “ex1”, NULL) 里的最后一个参数必须是 NULL代表参数传完了。3. wait() —— 等孩子回家需要头文件#include sys/wait.h。wait(NULL)父进程停在这里等子进程执行完回收资源(收尸)4. 僵尸进程如果子进程死了父进程却没调用 wait()子进程的进程号PID就会一直留在系统的进程表里这就是僵尸进程Zombie Process。它不占CPU和内存但会消耗PID资源一旦PID耗尽系统就无法创建新进程。所以父进程必须调用 wait() 收尸5. perror全称是print error当操作系统的系统调用比如 fork、execl、open 等执行失败时它们自己不会打印任何错误信息只会返回一个特殊值比如 -1同时偷偷把失败的原因藏在一个全局变量 errno 里错误代码是个数字比如 2、13.如果你直接打印这个数字你看到的是 错误代码: 2根本不知道是什么意思。这时候perror 就派上用场了它能根据 errno 里的数字翻译成人类能看懂的英文句子结合报告代码若excel()失败execl会返回 -1并设置errno。接着代码继续往下走碰到了perror(execl failed)。perror 立刻读取 errno在终端打印出类似这样的一行字execl failed: No such file or directory6.pid_t pidpid_t是 Process ID type进程ID类型的缩写。它是一个系统提前定义好的数据类型类似于 int、float。在 Linux 里它其实底层就是一个有符号整数int但操作系统为了跨平台兼容故意叫pid_t。准备这个 pid 盒子是为了接住 fork() 函数的返回值。要使用他代码最顶部必须带上#include sys/types.h和#include unistd.h