Linux程序设计知识点整理.docx_第1页
Linux程序设计知识点整理.docx_第2页
Linux程序设计知识点整理.docx_第3页
Linux程序设计知识点整理.docx_第4页
Linux程序设计知识点整理.docx_第5页
已阅读5页,还剩66页未读 继续免费阅读

VIP免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Prerequisite一、Linux 命令1、文件操作列出目录内容: ls, dir, vdir创建特殊文件: mkdir, mknod, mkfifo文件操作: cp, mv, rm修改文件属性: chmod, chown, chgrp, touch查找文件: locate, find字符串匹配: grep(egrep)其它: pwd, cd, ar, file, grep, tar, more, less, head, tail, cat2、进程操作ps, kill, jobs, fg, bg, nice3、其它who, whoami, passwd, su, uname, man二、Linux工具编辑工具:vi, emacs编译、链接:gcc(GNU C Compiler - GNU Compiler Collection)调试:gdbmake命令版本控制工具:CVS等三、编程语言1、High-level Language:C/C+, Java, Fortran2、ELF binary format:Excutable and Linkable Format(工具接口标准委员会(TIS)选择了正在发展中的ELF体系上不同操作系统之间可移植的二进制文件格式)四、GCC使用-E: 只对源程序进行预处理(调用cpp预处理器)-S: 只对源程序进行预处理、编译-c: 执行预处理、编译、汇编而不链接-o output_file: 指定输出文件名-g: 产生调试工具必需的符号信息-O/On: 在程序编译、链接过程中进行优化处理-Wall: 显示所有的警告信息-Idir: 指定额外的头文件搜索路径-Ldir: 指定额外的库文件搜索路径 -lname: 链接时搜索指定的库文件-DMACRO=DEFN: 定义MACRO宏Gcc过程:预处理、编译、汇编、链接GDB使用设置断点、监视变量值、单步执行、修改变量值make -f filename targetnameShell编程一、 Shell概述1、Shell 用户和操作系统之间的接口、作为核外程序而存在2、Shell 的双重角色1)、命令解释程序(1)Linux的开机启动过程:加载BIOS;读取MBR(Master Boot Record);Boot Loader;加载内核;用户层init依据inittab文件来设定运行等级;init进程执行rc.sysinit;启动内核模块;执行不同运行级别的脚本程序;执行/etc/rc.d/rc.local;执行/bin/login程序,进入登录状态(2)进程树:进程树是一种进程关系表示方法。由父进程和子进程两部分组成。(3)Shell的工作步骤:打印提示符;得到命令行;解析命令;查找文件;准备参数;执行命令2)独立的程序设计语言解释器(1)KISS (Keep It Small and Stupid)(2)Reusable tools(3)Redirection and pipe二、创建和执行Shell程序1、编写脚本文件(注释、退出码(exit 0)2、执行脚本文件方法1:$ sh script_file 方法2:chmod +x script_file (chown, chgrp optionally)./script_file方法3:source script_file, or . script_file1、 在当前bash环境下新建一个子shell来执行这个脚本,继承父Shell的环境变量,用于执行刚修改的初始化文档,2、这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务。由于是在子shell中执行,脚本设置的变量不会影响当前shell。3、source的程序主体是bash,脚本中的$0变量的值是bash,而且由于作用于当前bash环境,脚本中set的变量将直接起效三、Shell程序设计的语法1、变量1、用户变量:(1)定义:用户在shell脚本里定义的变量(2)赋值和使用:var=valueecho $var(3)read命令:(read -p Enter your name: name)read var 或 readREPLY variable(环境变量REPLY中包含输入的所有数据,可以像使用其他变量一样在shell脚本中使用环境变量REPLY,当然,在引用的时候不要忘记$)-s:默读、在输入密码时用的到-t:计时输入,后接等待秒数(4)引号的用法:双引号作用:$ , ,这些字符的特殊含义还是存在单引号:忽略所有的特殊字符2、用户环境(1).bash_profile, .bash_logout, .bashrc files.bash_profile: 用户登录时被读取,其中包含的命令被bash执行.bashrc: 启动一个新的shell时读取并执行.bash_logout: 登录退出时读取执行(2)Alias:alias别名=指令名称,若不加任何参数,则列出目前所有的别名设置。alias的效力仅及于该次登入的操作。若要每次登入是即自动设好别名,可在/etc/profile或自己的/.bashrc中设定指令的别名。Unalias 别名(3)环境变量:export -fnp变量名称=变量设置值-f 代表变量名称中为函数名称。 -n 删除指定的变量。变量实际上未删除,只是不会输出到后续指令的执行环境中。-p 列出所有的shell赋予程序的环境变量。env:显示当前用户的环境变量;set:用set 命令可以设置各种shell选项或者列出shell变量-a 标示已修改的变量,以供输出至环境变量。-b 使被中止的后台程序立刻回报执行状态。-C 转向所产生的文件无法覆盖已存在的文件。-d Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。-d参数可取消。-e 若指令传回值不等于0,则立即退出shell。-f 取消使用通配符。-h 自动记录函数的所在位置。-H Shell 可利用!加的方式来执行history中记录的指令。-k 指令所给的参数都会被视为此指令的环境变量。-l 记录for循环的变量名称。-m 使用监视模式。-n 只读取指令,而不实际执行。-p 启动优先顺序模式。-P 启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。-t 执行完随后的指令,即退出shell。-u 当执行时使用到未定义过的变量,则显示错误信息。-v 显示shell所读取的输入值。-x 执行指令后,会先显示该指令及所下的参数。+ 取消某个set曾启动的参数。3、环境变量(Shell环境提供的变量。通常使用大写字母做名字)4、参数变量和内部变量调用脚本程序时如果带有参数,对应的参数和额外产生的一些变量。2、条件测试1、字符串比较2、算数比较3、与文件有关的条件测试4、逻辑操作5、条件语句(1)形式:(紧凑形式; (同一行上多个命令的分隔符)if expression thenstatementselif expression thenstatementselif elsestatementsfi6、case语句(1)形式:case str instr1 | str2) statements;str3 | str4) statements;*) statements;Esac3、重复语句1、for语句:适用于对一系列字符串循环处理(1)形式:for var in listdostatementsdone例:#!/bin/shfor file in $(ls f*.sh); do lpr $filedoneexit 02、while语句(1)形式:while conditiondostatementsdone3、until 语句(不推荐使用)(1)形式:until conditiondostatementsdone4、Select语句:生成菜单列表(1)形式:select item in itemlistdostatementsdone4、命令表业语句块1、命令表(1)命令组合分号串联:command1 ; command2 ; 条件组合:AND命令表:只有在 & 左边的命令返回真,& 右边的命令才会被执行格式:statement1 & statement2 & statement3 & OR命令表:只有在 | 左边的命令返回假,| 右边的命令才会被执行。格式:statement1 | statement2 | statement3 | 2、语句块(1)形式 statement1 statement2 或 statement1; statement2 ; ; 5、函数(1)形式function funcname() statements return int(2)局部变量:局部变量只适用于当前shell,local关键字(3)函数的调用:func para1 para2 6、其他1、杂项命令:break: 从for/while/until循环退出continue: 跳到下一个循环继续执行exit n: 以退出码”n”退出脚本运行return: 函数返回export: 将变量导出到shell,使之成为shell的环境变量set: 为shell设置参数变量unset: 从环境中删除变量或函数trap: 指定在收到操作系统信号后执行的动作“:”(冒号命令): 空命令“.”(句点命令)或source: 在当前shell中执行命令2、find命令(1)形式:find path options tests actionsOptionsTests可以用操作符进行组合测试 :!(-not); -a(-and); -o(-or)可以用圆括号来强制测试和操作符的优先级,需要用到转义字符例:find . (-name _* -or -newer while2) -type f print-amin、-anewer、-atime-cmin、-cnewer、-ctime-empty、-gid or -group、-pid-name, -iname-size、-type-ipath, -path路径名符合p的文件,ipath表示忽略大小写actions3、grep命令(用于在文件中查找字符串)(1)形式:grep OPTIONS PATTERN FILES(2)正则表达式:广泛用于Linux和许多其他编程语言中,基本原理都是一样的注:上表中的括号需要使用转移字符,如 grep E a-z10 words2.txt4、捕获命令输出(1)语法:$(command)command(2)例:#!/bin/shecho “The current directory is $PWD”echo “The current directory is $(pwd)”exit 05、算数扩展(1)expr命令(支持的operator包括)expr argument operator argument(2)$()扩展例:x=$($x+1)6、参数扩展#!/bin/shi=0while “$i” ne 10 ; do touch “$i_tmp” i=$($i+1)doneexit 07、即时文档在shell脚本中向一条命令传送输入数据#!/bin/bashcat block15数组(2)Block12-14:间接索引Block12:b/4Block13:b/4*b/4Block14:b/4*b/4*b/42、系统调用和库函数1、比较:相同点:都以C函数的形式出现不同点:系统调用:Linux内核的对外接口; 用户程序和内核之间唯一的接口; 提供最小接口库函数:依赖于系统调用; 提供较复杂功能2、可缓冲和非缓冲的I/O(1)Unbuffered I/Oread/write -System callsFile descriptor不在标准化C中,但是存在于POSIX.1和XPG3(2)Buffered I/O用标准I/O实现处理很多细节, 如缓存分配, 以优化长度执行I/O等.Stream - a pointer to FILE3、基本I/O系统调用1、文件描述符:无符号整数表示的句柄 在中定义的:STDIN_FILENO (0), STDOUT_FILENO (1), STDERR_FILENO (2) 打开文件操作基本流程:open-read/write-lseek-close2、基本I/O操作3、错误处理(1)采用UNIX风格,返回错误代号”errno”,errno变量和错误代码都在头文件 /usr/include/errno.h 中定义(2)strerror & perrorchar *strerror(int errnum); void perror(const char *msg);4、open/creat函数(打开或者有可能创建一个文件)#include #include #include int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode); int creat(const char *pathname, mode_t mode);* creat(pathname, mode)等价于open(pathname, O_WRONLY|O_CREAT|O_TRUNC, mode)返回值:成功时返回文件的描述符,失败时返回-1参数:(1)flags(除了O_RDONLY、O_WRONLY 、 O_RDWR以外的):O_APPEND:以追加方式打开O_TRUNC::如果文件已经存在并且是一个普通文件且打开方式允许写操作,则文件长度被截0O_CREAT:如果文件不存在则创建O_EXCL:如果文件已经存在则错误返回(2)mode:如果新文件被创建设置其属性*umask机制:新创建文件的权限为:mode & umask目录默认:777,文件默认:6665、close函数#include int close(int fd);返回值:成功则返回0,失败则返回16、read/write函数#include ssize_t read(int fd, void *buf, size_t count);返回值: 读到的字节数,若已到文件尾为0,若出错为-1ssize_t write(int fd, const void *buf, size_t count);返回值: 若成功为已写的字节数,若出错为-17、lseek函数:定位文件中的读写位置#include #include off_t lseek(int fildes, off_t offset, int whence);返回值:如果成功则返回地址的偏移量,失败则返回-1参数whence:SEEK_SET: 从文件开头计算偏移量SEEK_CUR: 从文件当前的位置开始计算偏移量SEEK_END: 从文件结尾的位置开始计算偏移量8、dup/dup2函数:复制文件描述符*文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。dup返回新的文件文件描述符(没有用的文件描述符最小的编号)。dup2可以让用户指定返回的文件描述符的值,如果需要,则首先接近newfd的值,他通常用来重新打开或者重定向一个文件描述符。#include int dup(int oldfd);int dup2(int oldfd, int newfd);返回值:成功则返回文件新的描述符,失败则返回-19、文件共享与原子操作不同进程间共享打开文件:进程表项文件表i节点表10、fcntl函数:对指定的描述符对应的文件进行操作#include #include int fcntl(int fd, int cmd);int fcntl(int fd, int cmd, long arg);int fcntl(int fd, int cmd, struct flock *lock);返回值: 若成功则依赖于cmd,若出错为-1F_DUPFD: 用来查找大于或等于参数arg的最小且仍未使用的文件描述词,并且复制参数fd的文件描述词。F_GETFD/F_SETFD: 取得/设置close-on-exec旗标。F_GETFL/F_SETFL: 取得/设置文件描述词状态旗标F_GETOWN/F_SETOWN: 管理可用的I/O信号F_GETLK/F_SETLK/F_SETLKW: 取得/设置文件锁定的状态,后者若连接断开则直接错误返回11、ioctl函数:控制设备,提供了一种获得设备信息和向设备发送控制参数的手段。#include int ioctl(int d, int request, .);4、标准I/O库1、文件流(1)结构:Stream and “FILE” structureFILE* fp;Predefined pointer: stdin, stdout, stderr(2)可缓冲的I/O三种缓冲方式:全缓冲、行缓冲、不缓冲2、open/close函数:#include FILE *fopen(const char *filename, const char *mode);int fclose(FILE *stream);参数:Mode:“r”(只读)、“w”(覆盖原有内容)、“a”(追加写)、“r+”(可读写)、 “w+”(可读写、如果不存在则创建,已有内容则覆盖)、“a+”(可读可追加,如果不存在则创建)3、close函数#include int fclose(FILE *fp);返回值:成功返回0,失败返回-13、字符输入:从流中读取一个字符,作为从无符号char转换成int返回,如果到末尾返回EOF#include int getc(FILE *fp);int fgetc(FILE *fp);int getchar(void);*ungetchar将字符送回流中4、字符输出:#include int putc(int c, FILE *fp);int fputc(int c, FILE *fp);int putchar(int c);5、一行字符串输入:fgets, gets functions,读取最多size-1个字符,存入s中(s最后一个字符为0),遇到EOF则停止读取)#include char *fgets(char *s, int size, FILE *stream);char *gets(char *s); /not recommended.6、一行字符串的输出:fputs, puts functions#include int fputs(const char *s, FILE *stream);int puts(const char *s);7、二进制流输入/输出#include size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);size fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);8、格式化I/O(1)scanf, fscanf, sscanf functions不推荐,使用fgets(),然后解析字符串#include int scanf(const char *format, .);int fscanf(FILE *stream, const char *format, .);int sscanf(const char *str, const char *format, .);(2)printf, fprintf, sprintf functions#include int printf(const char *format, .);int fprintf(FILE *stream, const char *format, .);int sprintf(char *str, const char *format, .);9、流的重定位:(1)fseek, ftell, rewind functions#include int fseek(FILE *stream, long int offset, int whence);long ftell(FILE *stream);void rewind(FILE *stream);(2)fgetpos, fsetpos functions ( Introduced in ANSI C)#include int fgetpos(FILE *fp, fpos_t *pos);int fsetpos(FILE *fp, const fpos_t *pos);10、fflush()函数:刷新文件流。把流里的数据立刻写入文件#include int fflush(FILE *stream);11、流缓冲操作#include void setbuf(FILE *stream, char *buf);int setvbuf(FILE *stream, char *buf, int mode, size_t size);12、流描述符操作(1)确定流使用的底层文件描述符#include int fileno(FILE *fp);(2)根据已打开的文件描述符创建一个流#include FILE *fdopen(int fildes, const char *mode);13、临时文件(1)为临时文件创建名字#include char *tmpnam(char *s);返回值: 指向唯一路径名的指针(2)创建一个临时文件#include FILE *tmpfile(void);返回值: 若成功为文件指针,若出错为NULL5、UNIX标准化ISO C:提供C程序的可移植性,在不同的操作系统上运行,不只是UNIX系统POSIX(Portable operating system interface):操作系统接口;UNIX系统间应用程序的可移植性SUS(Single UNIX specification):扩展了POSIX接口1、标准化实现:POSIX.1:SVR4、4.4BSD、FreeBSD、Linux、MAC OS XSUS:Solaris2、UNIX限制(1)编译时限制:短整型的最大值是多少、在头文件中定义、ISO C limits 定义(limits.h stdio.h)(2)运行时限制:文件名长度最大是多少、POSIX限制、SUS 限制3、运行时确定中不一定定义所有值4、I/O效率问题随着BufferSize的增长,时间开始时快速下降,BufferSize到达某一值时,时间趋向平稳6、文件共享1、文件与进程的关系(1)不同的进程可以打开同一个文件(2)打开的文件在内核的表示:fd、file、vnode/inode2、几点注意的地方write对offset的影响、O_APPEND模式对offset的影响、lseek对offset影响3、文件共享中的flags(1)fd flagsfcntl(fd, F_GETFD/F_SETFD,arg)(2)file flagsfcnt(fd, F_GETFL/F_SETFL,arg)(3)file share多进程共享写操作会发生什么情况?lseek,write-O_APPEND多进程共享创建文件会发生什么?open,create-O_EXCL4、Linux文件缓存机制7、高级系统调用1、stat/fstat/lstat 函数:获取文件状态#include #include #include int stat(const char *file_name, struct stat *buf);int fstat(int filedes, struct stat *buf);int lstat(const char *file_name, struct stat *buf);返回值:成功则返回0,失败则返回-1*stat数据结构了解2、文件类型的宏定义3、文件权限(Linux中文件的权限可以用4个8进制表示)S G T R W X R W X R W Xchmod 777 /test/perm.testls l /usr/bin/passwd: -rwsr-xr-xst_mode & S_IRUSR4、粘滞位(只对目录有效)(1)粘住位本来是针对可执行的程序文件,S_ISVTX (saved_text bit, 保存正文位) (2)现今的系统扩展了粘住位的使用范围,Single UNIX Specification允许针对目录设置粘住位。(3)如果对一个目录设置了粘住位,则只有对该目录有写权限的用户在满足下列条件之一的情况下,才能删除或更名该目录下的文件:拥有此文件、拥有此目录、是超级用户。(4)目录/tmp和/var/spool/uucppublic是典型的设置粘住位的目录。任何用户都可以在这两个目录中创建文件,任一用户(用户、组或其他)对这两个目录的权限通常都是读、写和执行,但用户不能删除或更名其他人的文件。为此,在这两个目录的文件模式中都设置了粘住位。5、euid, guid:进程访问资源的依据SUID的功能是改变进程的euidSUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid6、access函数:按实际用户ID和实际组ID测试文件存取权限#include int access(const char *pathname, int mode);7、umask函数:为进程设置文件存取权限屏蔽字,并返回以前的值#include #include mode_t umask(mode_t mask);8、chmod/fchmod 函数:改变文件的权限#include #include int chmod(const char *path, mode_t mode);int fchmod(int fildes, mode_t mode);自动清理两个权限位:不需要超级用户的权限来去除粘滞位Sgid cleard for:Without superuser privilege and gid not equals egid9、chown/fchown/lchown 函数:更改文件的所有者#include #include int chown(const char *path, uid_t owner, gid_t group);int fchown(int fd, uid_t owner, gid_t group);int lchown(const char *path, uid_t owner, gid_t group);10、文件的大小索引节点和目录关系:Stat function 获取信息的来源自inode和dentry每个文件系统各自对inode编号,所以ln不能跨越文件系统文件命名操作:创建一个新的dentry对象,删除旧的连接11、link/unlink函数创建连接:#include int link(const char *oldpath, const char *newpath);删除链接:#include int unlink(const char *pathname);12、符号连接13、symlink/readlink函数:创建一个符号连接#include int symlink(const char *oldpath, const char *newpath);读取一个符号链接#include int readlink(const char *path, char *buf, size_t bufsiz);14、文件的时间15、utime函数:16、目录操作创建一个空目录#include #include int mkdir(const char *pathname, mode_t mode);创建:记得赋予可执行权限删除一个空目录#include int rmdir(const char *pathname);删除:链接为0并且没有进程打开这个目录改变工作目录#include int chdir(const char *path);int fchdir(int fd);当前工作目录是进程的属性,所以该函数只影响调用chdir的进程本身获得当前工作目录的绝对路径#include char *getcwd(char *buf, size_t size);17、读取路径数据结构:DIR:目录流对象的数据类型struct dirent:目录项方法:目录的打开、关闭、读、定位#include #include DIR *opendir(const char *name);int closedir(DIR *dir);struct dirent *readdir(DIR *dir);off_t telldir(DIR *dir);void seekdir(DIR *dir, off_t offset);st_dev/st_rdev文件所在存储系统的设备号字符设备/块设备自己的设备号8、高级I/O1、文件锁记录锁:读锁(共享锁)、写锁(独占锁)2、fcntl记录锁用于记录锁的fcntl函数原型#include #include int fcntl(int fd, int cmd, struct flock *lock);cmd参数的取值F_GETLK:获得文件的封锁信息F_SETLK:对文件的某个区域封锁或解除封锁F_SETLKW:功能同F_SETLK, wait方式。3、文件封锁竞争现象9、系统数据文件和信息1、系统数据文件:passwd文件,shadow文件,组文件,.2、存取passwd文件信息的函数根据uid或登录名查看相关记录#include #include struct passwd *getpwuid(uid_t uid);struct passwd *getpwnam(const char *name);查看整个口令文件#include #include struct passwd *getpwent(void);返回值:若成功为指针,若出错或到达文件尾端为NULLvoid setpwent(void);void endpwent(void);3、存取group文件信息的函数根据gid或组名查看相关记录#include #include struct group *getgruid(gid_t gid);struct group *getgrnam(const char *name);查看整个组文件#include #include struct group *getgrent(void);返回值:若成功为指针,若出错或到达文件尾端为NULLvoid setgrent(void);void endgrent(void);4、附加组ID存取和设置附加组ID的函数#include #include int getgroups(int gidsetsize, gid_t grouplist);返回值:若成功为附加组ID的数目,若出错为-1int setgroups(int ngroups, const gid_t grouplist);int initgroups(const char *username, gid_t basegid);5、其他函数相同的存取界面风格get函数:gethostent, getnetent, getproent, getservent, .set函数sethostent, setnetent, setproent, setservent, .end函数endhostent, endnet

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论