《Linux操作系统 第7章 Linux环境编程.ppt》由会员分享,可在线阅读,更多相关《Linux操作系统 第7章 Linux环境编程.ppt(65页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第7章 Linux环境编程 主要内容系统调用和库函数简介文件操作进程管理和同步进程通信内存管理 7.1 系统调用和库函数 7.1.1 系统调用 系系统统调调用用是是操操作作系系统统提提供供的的、与与用用户户程程序序之之间间的的接接口口,也也就就是是操操作作系系统提供给程序员的接口统提供给程序员的接口 从从感感觉觉上上系系统统调调用用类类似似于于过过程程调调用用,都都由由程程序序代代码码构构成成,使使用用方方式式相相同同 两两者者有有实实质质差差别别:过过程程调调用用只只能能在在用用户户态态下下运运行行,不不能能进进入入核核心心态态;而系统调用可以实现从用户态到核心态的转变。而系统调用可以实现从
2、用户态到核心态的转变。系系统统调调用用可可大大致致分分为为五五个个类类别别:进进程程控控制制、文文件件管管理理、设设备备管管理理、信信息维护和通信息维护和通信 7.1.2 库函数 它们本身并不属于操作系统的内核部分它们本身并不属于操作系统的内核部分 库函数可以分为下面六大类:库函数可以分为下面六大类:文件管理文件管理 状态信息状态信息 文件修改文件修改 程序设计语言的支持程序设计语言的支持 程序装入和执行程序装入和执行 通信通信 7.1.3 调用方式例如,例如,creatcreat系统调用可以创建一个新文件,其函数原型说系统调用可以创建一个新文件,其函数原型说明如下:明如下:#include
3、sys/#include#include sys/#include#include#include intint open(constopen(const char*path,char*path,intint oflagsoflags););不同的系统调用所需要的头文件(又称前导文件)是不同不同的系统调用所需要的头文件(又称前导文件)是不同的。的。7.2 文 件 操 作7.2.1 有关文件操作的系统调用 常用的有关文件操作的系统调用有:常用的有关文件操作的系统调用有:creatcreat,openopen,closeclose,readread,writewrite,lseeklseek,li
4、nklink,unlinkunlink,mkdirmkdir,rmdirrmdir,chdirchdir,chmodchmod等等 例如:例如:#include sys/#include#include sys/#include#include#include intint creat(constcreat(const char*pathname,char*pathname,mode_tmode_t mode);mode);#include sys/#include#include sys/#include#include#include intint open(constopen(const
5、 char*path,char*path,intint oflagsoflags););intint open(constopen(const char*path,char*path,intint oflagsoflags,mode_tmode_t mode);mode);7.2.2 应用示例 /*/*rdwr.crdwr.c-The read and write system calls-The read and write system calls*/*/#include#include#include sys/#include#include sys/#include#include#i
6、nclude#include#include#include#include intint main(voidmain(void)intint fd1,fd2,fd3,nbytes;fd1,fd2,fd3,nbytes;intint flags=O_CREAT|O_TRUNC|O_WRONLY;flags=O_CREAT|O_TRUNC|O_WRONLY;char buf10;char buf10;if(fd1=open(rdwr.c,O_RDONLY,0644 if(fd1=open(rdwr.c,O_RDONLY,0644)0)0)perror(openperror(open rdwr.c
7、rdwr.c););exit(EXIT_FAILUREexit(EXIT_FAILURE););if(fd2=open(/dev/if(fd2=open(/dev/null,O_WRONLYnull,O_WRONLY)0)0)perror(openperror(open/dev/null);/dev/null);exit(EXIT_FAILUREexit(EXIT_FAILURE););if(fd3=open(/tmp/foo.bar,flags,06if(fd3=open(/tmp/foo.bar,flags,0644)0)44)=read(fd1,buf,10)0)0)if(write(f
8、d2,buf,10)0)if(write(fd2,buf,10)0)perror(writeperror(write/dev/null);/dev/null);if(write(fd3,buf,nbytes)0)if(write(fd3,buf,nbytes)0)perror(writeperror(write /tmp/foo.bartmp/foo.bar););write(STDOUT_FILENO,buf,10);write(STDOUT_FILENO,buf,10);close(fd1);close(fd1);close(fd2);close(fd2);close(fd3);close
9、(fd3);exit(EXIT_SUCCESSexit(EXIT_SUCCESS););7.3 进 程 控 制7.3.1 有关进程控制的系统调用 常用的有关进程控制的系统调用有:常用的有关进程控制的系统调用有:forkfork,execexec,waitwait,exitexit,getpidgetpid,sleepsleep,nicenice等等 例如:例如:#include#include#include sys/#include pid_tpid_t fork(voidfork(void););#include#include#include sys/#include pid_tpid_
10、t getpid(voidgetpid(void););pid_tpid_t getppid(voidgetppid(void););7.3.2 应用示例/*proc1.c/*proc1.c演示有关进程操作演示有关进程操作*/#include#include#include sys/#include#include#include#include#include intint main(intmain(int argc,charargc,char*argvargv)pid_tpid_t pid,old_ppid,new_ppidpid,old_ppid,new_ppid;pid_tpid_t
11、child,parentchild,parent;parent=parent=getpidgetpid();();/*/*获得本进程的获得本进程的PID*/PID*/if(childif(child=fork()0)=fork()0)fprintf(stderr,%s:forkfprintf(stderr,%s:fork of of child child failed:%sn,argv0,strerror(efailed:%sn,argv0,strerror(errno);rrno);exit(1);exit(1);else else if(childif(child=0)=0)/*/*此此
12、时是子进程被调度运行时是子进程被调度运行*/old_ppidold_ppid=getppidgetppid();();sleep(2);sleep(2);new_ppidnew_ppid=getppidgetppid();();else else sleep(1);sleep(1);exit(0);/*exit(0);/*父进程退出父进程退出*/*/*下面仅子进程运行下面仅子进程运行*/printf(Originalprintf(Original parent:%dn,parentparent:%dn,parent););printf(Child:%dn,getpidprintf(Child:
13、%dn,getpid();();printf(Childsprintf(Childs old old ppid:%dn,old_ppidppid:%dn,old_ppid););printf(Childsprintf(Childs new new ppid:%dn,new_ppidppid:%dn,new_ppid););exit(0);exit(0);7.4 进 程 通 信LinuxLinux下进程间通信的几种主要手段是:管道(下进程间通信的几种主要手段是:管道(pipepipe)及有名管道)及有名管道(named pipenamed pipe)、信号()、信号(signalsignal)、
14、消息()、消息(messagemessage)、共享内存)、共享内存(shared memoryshared memory)、信号量)、信号量(semaphore)(semaphore)和套接口(和套接口(socketsocket)。)。7.4.1 有关进程通信的函数 例如:例如:#include#include intint pipe(intpipe(int filedes2);filedes2);#include sys/#include#include sys/#include intint mkfifo(constmkfifo(const char*pathname,char*path
15、name,mode_tmode_t mode);mode);7.4.2 应用示例/*/*pipedemo.cpipedemo.c演示使用管道机制进行演示使用管道机制进行I/OI/O控制控制*/#include#include#include#include#include#include intint main(intmain(int argc,charargc,char*argvargv)static const char static const char mesgmesg=Happy=Happy New Years to you!;New Years to you!;char char
16、bufBUFSIZbufBUFSIZ;size_tsize_t rcount,wcountrcount,wcount;intint p_fd2;p_fd2;size_tsize_t n;n;if(pipe(p_fdif(pipe(p_fd)0)/*)0)/*创建管道创建管道*/fprintf(stderr,%s:pipefprintf(stderr,%s:pipe failed:%sn,argv0,strerror(errno);failed:%sn,argv0,strerror(errno);exit(1);exit(1);printf(Readprintf(Read end=end=fdf
17、d%d,writed,write end=end=fdfd%dn,p_fd0,p_fd1);%dn,p_fd0,p_fd1);n=n=strlen(mesgstrlen(mesg););if(wcountif(wcount=write(p_fd1,mesg,n)=write(p_fd1,mesg,n)!=n)/*)!=n)/*写入数据写入数据*/fprintf(stderr,%s:writefprintf(stderr,%s:write failed:%sn,argv0,strerror(errnfailed:%sn,argv0,strerror(errno);o);exit(1);exit(
18、1);if(rcountif(rcount=read(p_fd0,buf,BU=read(p_fd0,buf,BUFSIZ)!=FSIZ)!=wcountwcount)/*)/*读出数据读出数据*/fprintf(stderr,%s:readfprintf(stderr,%s:read failed:%sn,argv0,strerror(errnfailed:%sn,argv0,strerror(errno);o);exit(1);exit(1);bufrcountbufrcount=0;=0;printf(Readprintf(Read from from pipepipen,bufn,bu
19、f););close(p_fd0);close(p_fd0);close(p_fd1);close(p_fd1);return 0;return 0;7.5 内 存 管 理#include#include void*void*malloc(size_tmalloc(size_t size);size);#include#include void*void*calloc(size_tcalloc(size_t nmembnmemb,size_tsize_t size);size);#include#include void*void*realloc(voidrealloc(void*ptrptr
20、,size_tsize_t size);size);#include#include void void free(voidfree(void*ptrptr););进程与任务或作业管理 程序、进程、作业和任务的概念Linux操作系统的启动过程进程状态及转换进程调度、信号与软中断suid、sgid和sticky属性进程调度命令作业和任务管理图形界面下的进程管理 1程序和进程的概念 操作系统的重要任务之一是使用户充分、有效地操作系统的重要任务之一是使用户充分、有效地利用系统资源,也就是在系统资源一定或有限的利用系统资源,也就是在系统资源一定或有限的情况下,要同时执行更多程序,高效率地完成更情况下,
21、要同时执行更多程序,高效率地完成更多的任务。多的任务。进程、作业和任务调度是操作系统的重要任务之进程、作业和任务调度是操作系统的重要任务之一。一。本章的主要内容是从系统的外部来观察系统中与本章的主要内容是从系统的外部来观察系统中与进程进程(process)(process)和作业和作业(job)(job)或任务或任务(task)(task)相关的相关的行为,并实施某些控制让系统工作的更好,或按行为,并实施某些控制让系统工作的更好,或按照用户的意图来完成指定工作。照用户的意图来完成指定工作。1.1程序、进程、作业和任务 程序(程序(programprogram)是一个存储在存储介质上的文件。是一
22、个存储在存储介质上的文件。进程(进程(proccessproccess)是一个程序的执行过程。是一个程序的执行过程。作业作业(job)(job)或任务或任务(task)(task)是用户需要计算机完成某是用户需要计算机完成某项任务时要求计算机所做工作的集合,一个作业项任务时要求计算机所做工作的集合,一个作业可能需要几个程序联合完成。可能需要几个程序联合完成。作业和进程主要的区别与关系如下:作业和进程主要的区别与关系如下:作业是用户向计算机提交的任务实体;作业是用户向计算机提交的任务实体;一个进程是作业或任务的某个执行过程;一个进程是作业或任务的某个执行过程;一个作业可由多个进程组成。一个作业可
23、由多个进程组成。1.2 三类进程 前台进程:前台进程:是指用户直接控制的用于完成某个任务的进程,因此是指用户直接控制的用于完成某个任务的进程,因此也叫终端交互式进程。它从标准输入读数据,向标准也叫终端交互式进程。它从标准输入读数据,向标准输出写数据,将错误信息输出到标准错误。也可以是输出写数据,将错误信息输出到标准错误。也可以是用户直接交互控制的完成某种功能的程序。用户直接交互控制的完成某种功能的程序。后台进程后台进程 是指在系统后台运行的、不与用户交互进程。是指在系统后台运行的、不与用户交互进程。前台的进程也可放在后台运行,这时可能要用到输入前台的进程也可放在后台运行,这时可能要用到输入输出
24、的重定向。输出的重定向。守候进程也叫服务器或精灵进程,它是后台进程的一守候进程也叫服务器或精灵进程,它是后台进程的一种。种。批处理进程批处理进程 是用户按照某种意图将一批作业和任务通过编程的方是用户按照某种意图将一批作业和任务通过编程的方法提交给系统,让系统在某个合适的时间来调度和执法提交给系统,让系统在某个合适的时间来调度和执行的进程。行的进程。批处理进程是在某个批处理进程是在某个shellshell程序的控制下解释执行的。程序的控制下解释执行的。1.3 Linux操作系统的启动 LinuxLinux的启动是通过加电和系统自检后,将主引导的启动是通过加电和系统自检后,将主引导程序程序MBRM
25、BR装入内存并把控制权交给它。装入内存并把控制权交给它。在在MBRMBR的控制下装入的控制下装入LinuxLinux的引导程序的引导程序LBRLBR并把控并把控制权交给它。制权交给它。在在LBRLBR的控制下系统继续引导,的控制下系统继续引导,核心装入内存。核心装入内存。系统开始进一步的初始化过程:首先初始化系统系统开始进一步的初始化过程:首先初始化系统内部数据结构(比如构造空闲缓冲区、初始化区内部数据结构(比如构造空闲缓冲区、初始化区表结构、页表项等),然后将根文件系统安装到表结构、页表项等),然后将根文件系统安装到根根“/”下,并创建系统的下,并创建系统的0#0#进程、设置它的运行进程、设
26、置它的运行环境。至此内核启动完成。环境。至此内核启动完成。接着继续创建接着继续创建1#1#进程,然后由进程,然后由1#1#进程做进一步的进程做进一步的初始化工作。初始化工作。Linux操作系统的启动(续)1#1#进程继续初始化过程,按照进程继续初始化过程,按照/etc/etc/inittabinittab文件文件的内容和规定启动服务、管理进程,为每个终端的内容和规定启动服务、管理进程,为每个终端生成一个子进程,等待用户在终端上注册,至此生成一个子进程,等待用户在终端上注册,至此启动过程完毕。启动过程完毕。1.4 0#进程与1#进程 在在UNIXUNIX系统中系统中0#0#进程是唯一只在核心态下
27、执行的进程是唯一只在核心态下执行的进程。它的功能有三:调度分配处理机;负责进进程。它的功能有三:调度分配处理机;负责进程交换;初始化时创建程交换;初始化时创建1#1#进程。在进程。在LinuxLinux系统中,系统中,0#0#进程在创建出进程在创建出1#1#进程后,变成了空闲进程进程后,变成了空闲进程(IdlerIdler),),当系统中没有其它进程就绪时运行。当系统中没有其它进程就绪时运行。1#(init)1#(init)进程是系统启动时创建的创建进程的进程。进程是系统启动时创建的创建进程的进程。它的主要作用是根据它的主要作用是根据/etc/etc/inittabinittab的内容创建系的
28、内容创建系统运行所需的进程。系统初始化完成后,统运行所需的进程。系统初始化完成后,1#1#进程进程了变成回收进程,专门领养没有父进程的孤儿进了变成回收进程,专门领养没有父进程的孤儿进程或回收状态为程或回收状态为ZOMBIEZOMBIE的僵尸进程。的僵尸进程。Linux的进程树0#进程创建了1#进程,它是1#进程的父进程。1#进程在系统启动过程中创建了系统所需要的其它进程。而子进程又可创建属于自己的子进程。因此除0#进程外,1#进程是其它所有进程的祖先进程。1.5 进程及运行模式 在UNIX/Linux系统中,进程可在用户态和核心态两种执行模式下执行。当用户进程需要系统核心提供服务而由用户态转向
29、核心态执行时,需要依靠中断或陷阱机制来实现,这时要切换处理机(CPU)的工作状态。两种状态之间的主要区别是,核心态下的进程具有较高的优先级,能够存取核心和用户数据。而用户态下的进程能存取它自己的指令与数据,但不能存取核心指令和数据。1.6 进程状态及转换 在操作系统中,一个在操作系统中,一个CPUCPU上同时只能运行一个进上同时只能运行一个进程,但在多用户、多任务环境下,从宏观上来讲,程,但在多用户、多任务环境下,从宏观上来讲,同时运行着很多进程,因此在这些正在运行着的同时运行着很多进程,因此在这些正在运行着的进程中,在任一时刻只能有一个进程占有处理机进程中,在任一时刻只能有一个进程占有处理机
30、而真正运行。也就是说众多运行着的进程中,它而真正运行。也就是说众多运行着的进程中,它们宏观上是并行的,但微观上是串行的。因此就们宏观上是并行的,但微观上是串行的。因此就存在着有的进程在运行,有的进程在等待问题。存在着有的进程在运行,有的进程在等待问题。事实上进程的状态远不只执行和等待两个,还有事实上进程的状态远不只执行和等待两个,还有用户态执行、核心态执行、等待、睡眠、就绪等用户态执行、核心态执行、等待、睡眠、就绪等状态。状态。UNIX系统的进程状态及转换进程在用户态运行。进程在用户态运行。进程在系统态运行。进程在系统态运行。就绪状态。就绪状态。进进程程因因等等待待资资源源而而在在内存中睡眠。
31、内存中睡眠。进程在外存中睡眠。进程在外存中睡眠。外存就绪。外存就绪。进程从系统态返回。进程从系统态返回。进进程程刚刚被被创创建建时时的的状状态。态。僵尸状态。僵尸状态。Linux系统的进程状态及转换就绪状态(执行)浅度睡眠深度睡眠停止状态僵尸状态2 UNIX/Linux进程调度UNIX/LinuxUNIX/Linux系统是分时系统,系统给每个进程分系统是分时系统,系统给每个进程分一个时间片,每个进程在自己的时间片内执行,一个时间片,每个进程在自己的时间片内执行,当时间片结束时或从系统服务中返回时,动态计当时间片结束时或从系统服务中返回时,动态计算进程的算进程的“优先级优先级”,若有优先级高于当
32、前进程,若有优先级高于当前进程的内存就绪态进程时,系统设置调度标识,并在的内存就绪态进程时,系统设置调度标识,并在以后某个时刻剥夺当前进程的执行权,而让优先以后某个时刻剥夺当前进程的执行权,而让优先级高的进程执行。级高的进程执行。UNIX/LinuxUNIX/Linux的进程调度按时间片计算的进程调度按时间片计算“优先级优先级”,并按,并按“优先级优先级”的高低来调度进程,使优先级的高低来调度进程,使优先级高的进程占有处理机而得到执行。高的进程占有处理机而得到执行。这里所说的这里所说的“优先级优先级”不是一个具体的数字或变不是一个具体的数字或变量,而是一个衡量优先程度的指标。量,而是一个衡量优
33、先程度的指标。2.1 调度策略与优先级的计算 Linux把所有进程分成两类:实时进程和普通进程。对普通进程采用时间片轮转法来调度进程的执行,所有就绪进程按先后排成队列,依次轮转,时间片用完而未完成任务者排在尾部,如此往复;对于实时进程则采用FIFO和时间片轮转进行调度。最后经调度模块综合计算出各进程的优先级,优先级最高者获得执行权。Nice Level优先级在优先级计算过程中有一个基本参数参与运算,在优先级计算过程中有一个基本参数参与运算,这就是传统这就是传统UNIX/Linux Nice LevelUNIX/Linux Nice Level优先级,按传优先级,按传统做法,把它记为统做法,把它
34、记为NICENICE。系统为每个进程设置了一个默认的系统为每个进程设置了一个默认的NICENICE值(值(0 0),),通过命令通过命令nicenice用户或管理员可以调整进程的用户或管理员可以调整进程的NICENICE值,从而达到调整优先级的目的。值,从而达到调整优先级的目的。在在Red Hat Linux 9Red Hat Linux 9中它的调整范围为中它的调整范围为-2019-2019,在,在其它其它UNIXUNIX中,中,NICENICE取值范围可能与此不同取值范围可能与此不同。沿用沿用UNIXUNIX的传统,的传统,NICENICE的值越大进程的优先级越的值越大进程的优先级越低。低
35、。NICENICE值可以被作为值可以被作为nicenice命令的参数来调试进程的命令的参数来调试进程的优先级。优先级。2.2 信号与软中断 Unix/LinuxUnix/Linux中使用很多信号,用于进程通信与控制。中使用很多信号,用于进程通信与控制。进程通信时信号由主进程或系统或硬件等发送到进程通信时信号由主进程或系统或硬件等发送到目的进程,当目的进程收到信号后要进行相应的目的进程,当目的进程收到信号后要进行相应的处理。若在目的进程在用户级执行,则收到信号处理。若在目的进程在用户级执行,则收到信号后立即处理,若在内核级运行时,先将信号记下后立即处理,若在内核级运行时,先将信号记下来,待返回到
36、用户级时再处理。来,待返回到用户级时再处理。用户可以向目的进程发送信号,而实现一定程度用户可以向目的进程发送信号,而实现一定程度的通讯,完成指定的工作或达到某种指定的目的。的通讯,完成指定的工作或达到某种指定的目的。用户可以对收到的信号采取系统指定的办法进行用户可以对收到的信号采取系统指定的办法进行处理,也可采取自己的办法进行处理,也可忽略处理,也可采取自己的办法进行处理,也可忽略信号信号 。Linux系统的中断LinuxLinux系统常用的中断信号可用命令系统常用的中断信号可用命令killkill,killallkillall和和fuserfuser来查询。如表来查询。如表6-16-1所示。
37、所示。在信号中,有的是硬件发出,比如在信号中,有的是硬件发出,比如SIGILLSIGILL、SIGSEGVSIGSEGV等,有的是可屏蔽的,比如等,有的是可屏蔽的,比如SIGHUPSIGHUP、SIGQUITSIGQUIT等,而等,而SIGKILLSIGKILL和和SIGSTOPSIGSTOP等是不可屏蔽。等是不可屏蔽。我们通常处理的只是一些软中断信号:我们通常处理的只是一些软中断信号:名称名称值值默认动作默认动作意义和功能描述意义和功能描述 SIGHUP SIGHUP 1 1终止运行终止运行挂机或断线信号挂机或断线信号SIGINT SIGINT 2 2终止运行终止运行键盘收到键盘收到Ctrl
38、+CCtrl+CSIGQUIT SIGQUIT 3 3写出映像写出映像键盘收到退出键盘收到退出Ctrl+Ctrl+SIGKILL SIGKILL 9 9终止运行终止运行KILLKILL,不可屏蔽,不可屏蔽SIGTERM SIGTERM 1515同上同上进程终止信号进程终止信号3进程管理与调度命令 可执行文件的setuid和setgid属性 可执行文件和目录的sticky属性查询进程状态(ps)按名称终止进程的执行(killall)确定使用指定文件或文件系统的进程(fuser)让进程抗终止运行(nohup)改变进程的优先级(nice)进程挂起或作业的前/后运行切换3.1 可执行文件的setuid
39、和setgid属性 在UNIX/Linux系统中,用户级别和执行权力是相关。但是有些工作,比如修改/etc/passwd和/etc/shadow文件等,对于普通用户都是必须的,因为它要修改密码。但是系统中这些文件对于普通用户是不允许有写操作的。于是就出现了普通用户通过某种机制行使超级用户权限的问题。可执行文件的setuid和setgid属性 当一个程序具有suid属性时,它执行时的uid将是该程序所有者的uid即有效uid,记为euid,而执行者的原来uid叫为真实uid,记为ruid。当一个程序具有sgid属性时,它执行时的gid将是该程序的gid即有效gid,记为egid,而执行者的原来g
40、id叫为真实gid,记为rgid。suid/sgid属性只对二进制可执行文件有效,对可执行的脚本文件无效。可执行文件的setuid和setgid属性(续)当一个属于超级用户的可执行二进制程序具有当一个属于超级用户的可执行二进制程序具有suidsuid属性时,则当一般用户执行它时,也就相当于有了属性时,则当一般用户执行它时,也就相当于有了超级用户的身份和权限。超级用户的身份和权限。同样当一个属于超级用户所在组的可执行二进制程同样当一个属于超级用户所在组的可执行二进制程序具有序具有sgidsgid属性时,则当一般用户执行它时,也就属性时,则当一般用户执行它时,也就相当于有了该组员的身份和权限。相当
41、于有了该组员的身份和权限。suidsuid和和sgidsgid权限的存在可能会给某些程序的执行带权限的存在可能会给某些程序的执行带来了方便,因为权限被放大了,但这也是一种危险。来了方便,因为权限被放大了,但这也是一种危险。因此设置这种权限的可执行二进制程序不宜太多。因此设置这种权限的可执行二进制程序不宜太多。常用的设置常用的设置suidsuid的程序有的程序有:/bin/ping/bin/ping、/usr/bin/passwdusr/bin/passwd、/usr/bin/newgrpusr/bin/newgrp、/usr/bin/sudousr/bin/sudo、/usr/sbin/sue
42、xecusr/sbin/suexec和和/usr/sbin/tracerouteusr/sbin/traceroutesetuid和setgid属性管理按照文件的属性,若用八进制表示,对应于按照文件的属性,若用八进制表示,对应于suidsuid和和sgidsgid的权限则为的权限则为40004000和和20002000。setuidsetuid和和setgidsetgid属性设置属性设置 1.1.数字方法:数字方法:chmodchmod 4755 myp1 4755 myp1#为为myp1myp1设置设置suidsuid chmodchmod 2775 myp2 2775 myp2#为为myp
43、2myp2设置设置sgidsgid chmodchmod 6777 myp3 6777 myp3#为为myp3myp3同时设置同时设置suidsuid和和sgidsgid 2.2.字符方式字符方式 chmodchmod u+s myp1 u+s myp1#为为myp1myp1设置设置suidsuid chmodchmod g+s myp2 g+s myp2#为为myp2myp2设置设置sgidsgid chmodchmod ug+sug+s myp3 myp3#为为myp3myp3同时设置同时设置suidsuid和和sgidsgid 修改后修改后权权限分限分别为别为:-rwsr-xr-xrws
44、r-xr-x,-rwxrwsr-xrwxrwsr-x 和和rwsrwsrwxrwsrwsrwx 2.目录的sticky权限 UNIX/Linux系统允许目录使用sticky位属性(粘着位)。当一个目录设置了sticky位后,它内部的文件只能被文件主、目录主或超级用户删除、更名或移动。设置sticky位的目录有/tmp、/usr/tmp和/var/spool/uucppublic等。在传统的UNIX系统中sticky对可执行文件还具有特殊意义(略)。sticky权限管理sticky位是对目录执行权来说的,它的属性值为1000。sticky位也可用chmod命令通过root用户来设置。设有目录my
45、dir的权限为drwxr-xr-x(755),则可通过以下两种方法来设置它的sticky位:chmodchmod 1755 1755 mydirmydir#数字方式数字方式chmodchmod+t +t mydirmydir#字符方式。字符方式。设置后的权限为设置后的权限为drwxr-xr-tdrwxr-xr-t或或17551755 3.2 进程管理与调度命令 1.查询进程状态(ps)功能:查询进程状态和信息,给出系统当前正在运行查询进程状态和信息,给出系统当前正在运行进程信息的快照。进程信息的快照。用法psps options options 说明:psps支持多种支持多种UNIXUNIX系
46、统格式的个性化显示方式。系统格式的个性化显示方式。且参数较多;且参数较多;可以配合可以配合killkill命令结束系统中失控或不必要的命令结束系统中失控或不必要的进程。进程。ps参数-A-A,-e-e:显示系统内的所有进程;显示系统内的所有进程;-a-a:显示所有与终端相关的进程显示所有与终端相关的进程 A A:显示当前终端的所有进程,也包括其它用户进程显示当前终端的所有进程,也包括其它用户进程-c-c:显示显示CLSCLS和和PRIPRI栏;栏;c c:列出进程名,但不包含路径名列出进程名,但不包含路径名-C-C pnamepname:显示进程名字为显示进程名字为pnamepname的同名进
47、程信息的同名进程信息-f-f:显示进程信息时显示带有路径的进程名和进程参数显示进程信息时显示带有路径的进程名和进程参数 F F:用:用ASCIIASCII字符显示树状结构的进程间关系字符显示树状结构的进程间关系 g g,-g/-G-g/-G gidgid:显示与进程组相关的信息,显示与进程组相关的信息,gidgid可以是组名或组号可以是组名或组号 H H:不显示标题;不显示标题;-H-H:显示树状结构以表示进程间的关系显示树状结构以表示进程间的关系 J J,-j-j:以作业控制方式显示进程信息;以作业控制方式显示进程信息;l,-ll,-l:以长格式显示进程信息以长格式显示进程信息 L L:显示
48、标题栏目信息;显示标题栏目信息;p/-p p/-p pidspids:显示指定进程的信息显示指定进程的信息 T,t/-t T,t/-t ttytty:显示终端相关进程信息,显示终端相关进程信息,T T只能用于显示当前终端进程信息只能用于显示当前终端进程信息 u,U/-U u,U/-U uiduid:显示与用户相关的信息,显示与用户相关的信息,uiduid可以是用户名或用户号。可以是用户名或用户号。X X:显示所有进程信息,不区分终端显示所有进程信息,不区分终端进程的状态 R R:RunableRunable,进程在执行中进程在执行中D D:DlayingDlaying,非中断性睡眠,通常是因为
49、等待非中断性睡眠,通常是因为等待I/OI/OS S:SleepSleep,正在睡眠正在睡眠T T:Traced or stoppedTraced or stopped,被跟踪或停止;被跟踪或停止;Z Z:ZombieZombie,僵尸状态。进程已经终止,但父进程没有对僵尸状态。进程已经终止,但父进程没有对它的结束作适当处理它的结束作适当处理WW:WaitWait,无内存页面(被换出)无内存页面(被换出)N N:低优先级进程低优先级进程L L:LockedLocked,页面被锁进内存(用于实时控制或用户控制页面被锁进内存(用于实时控制或用户控制的的I/OI/O):高优先级进程高优先级进程ps使用
50、示例#查询与终端(tty1)相关的进程信息psps-t tty1-t tty1#查询与用户(gjshao)相关的信息psps f u f u gjshaogjshao#查询整个系统内的进程信息情况 psps axjaxj按名称终止进程的执行(killall)功能:功能:killallkillall是另一个用来终止程序的命令,它不像是另一个用来终止程序的命令,它不像killkill使使用进程的用进程的PIDPID作为操作对象,而是使用进程名。作为操作对象,而是使用进程名。用法:用法:killallkillall-e-g-i-q-v-w-V-s -e-g-i-q-v-w-V-s signal-na