焦点快看:【Linux操作系统】系统调用和库函数编程基础知识

发布时间:   来源:CSDN  

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系统调用来扩大或缩小进程的堆栈空间;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:是系统中任意可执行文件的名称-n, --adjustment:指定程序运行优先级的调整值优先级的调整值范围为-20 ~ 19 ,其中数值越小优先级越高,数值越大优先级越低若nice命令未指定优先级的调整值,则以缺省值10来调整程序运行优先级,既在命令通常运行优先级基础之上 增加10 例子: [root@host root]# nice -n -5 myprogram& 在后台以通常运行优先级-5的优先级运行myprogram

1.4.2.2.4 命令名称:renice

功能描述:改变一个正在运行进程的nice值格式: renice [参数]-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用gdb同时调试一个运行程序和core文件(core是程序非法执行后core dump后产生的文件)gdb program core调试正在运行的进程gdb program,进入gdb后用attach调试正在运行的进程。 可让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式) 功能:断点设置命令break(缩写b),当gdb执行到该断点时会让程序暂停运行。此时程序员可以查看运行中程序的情况。格式:break [LOCATION] [thread THREADNUM] [if CONDITION][LOCATION]linenum (行号)function name(函数名)filename:linenumfilename:functionclass: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设置一 个观察点。一旦表达式值有变化时,马上停住程序。rwatch:当表达式(变量) expr被读时,停住程序。awatch:当表达式(变量)的值被读或被写时,停住程序info watchpoints :列出当前所设置了的所有观察点。 clear [linenum] [function name]清除所有断点,不会清除watchpoints。delete清除编号为num的断点或者watchpoint。disable禁止某个断点。enable开启某个断点。单步调试 step单步调试命令,一次执行一行程序。next单步调试命令,但跳过函数调用。finish单步调试时直接从一个函数中返回disassemble显示汇编代码。 堆栈调试 backtrace或者bt查看目前程序的堆栈情况。where查看当前位置。up/down向上或者向下移动一个堆栈。frame或者f移动到第num个堆栈。当移动到某个堆栈时,便可以用gdb命令查看在那个堆栈中的局部变量。

2、文件和目录

3、进程与线程

4、线程同步与进程间通信

相关文章Related

返回栏目>>