UNIX命令1
国家开放大学《操作系统》形考任务1答案
一、单选题为了使系统中所有的用户都能得到及时的响应,该操作系统应该是(分时系统)。
为用户分配主存空间,保护主存中的程序和数据不被破坏,提高主存空间的利用率。
这属于(存储管理)。
为了描述进程的动态变化过程,采用了一个与进程相联系的(进程控制块),根据它而感知进程的存在。
以下著名的操作系统中,属于多用户、分时系统的是(UNIX系统)。
以下不属于操作系统具备的主要功能的是(文档编辑)。
以下不属于进程高级通信方式的是(进程互斥和同步方式)。
下列关于引入线程的好处的描述中,不正确的是(利于分配资源)。
下列进程状态的转换中,不正确的是(从就绪到阻塞)。
下列关于进程和线程的叙述中,正确的是(一个进程可拥有若干个线程)下列系统中,属于实时系统的是(火车订票系统)。
在下列操作系统中,强调吞吐能力的是(多道批处理系统)。
在一段时间内,只允许一个进程访问的资源称为(临界资源)。
在分时系统中,时间片一定,则(用户数越多),响应时间越长。
在计算机系统中,操作系统是(处于裸机之上的第一层软件)。
在单处理机系统中,处于运行状态的进程(只有一个)。
在操作系统中引入“进程”概念的主要目的是(描述程序动态执行过程的性质)。
在操作系统中,进程的最基本的特征是(动态性和并发性)。
在进程通信中,使用信箱方式交换信息的是(消息传递方式)。
在执行V操作时,当信号量的值(小于等于0 ),应释放一个等待该信号量的进程。
UNIX命令的一般格式是(命令名[选项] [参数] )。
UNIX操作系统核心层的实现结构设计采用的是(层次结构)。
现代操作系统的基本特征是(程序的并发执行)、资源共享和操作的异步性。
现代操作系统中引入线程以后,进程(只是资源分配的单位)。
系统调用是由操作系统提供的内部调用,它(只能通过用户程序间接使用)。
系统出现死锁的原因是(若干进程因竞争资源而无休止地循环等待着,而且都不释放已占有的资源)。
操作系统对缓冲区的管理属于(设备管理)的功能。
第1单元-UNIX、GUN及Linux简介
4.2、Redhat版本介绍
红帽Linux的版本大致可分为三大类:
Red Hat 7.X,8.0,9.0
RedHat 推出的个人桌面版本,目前的最高版本是9.0, 同时也是最终的系列,取而代之的是FC系列。
Fedora Core (1,2,3,4,5,6,7,8,9,10,11,12,13)
Redhat不再发布桌面版后与开源社区合作,于是就有了 Fedora 这个 Linux 发行版。Fedora 可以说是Redhat 桌 面版本的延续,只不过是与开源社区合作。
2.3、开源软件与自由软件 自由软件(Free SoftWare)
自由软件是关于自由以及社区的一场道德运动,是一 种价值观,倡导者希望软件能够自由得使用,复制, 修改,分发等等,有些共产主义的韵味,因此自由软 件涉及到对与错的问题。
开源软件(Open SoftWare)
可以肤浅的认为开源软件=自由软件,他们几乎都开 放源代码。开源软件的哲学并不涉及到对与错,它仅 仅是一个实际的价值观。而自由软件是一种要求软件 自由的文化现象,是一种哲理、伦理和社会价值观, 而开源软件是一种开发模式。
3、Linux操作系统 Linux操作系统的起源 Linux操作系统的特点 常见的Linux发行版 Linux操作系统的展望
3.1、Linux的起源
Linux操作系统可以说 是UNIX操作系统的一 个“克隆体”,Linux的第 一个内核(Kernel)编写 于1991/10/5。由Linus Torvalds于芬兰赫尔辛 基大学发布的。 Linux是一个自由的、遵循 GNU 和GPL原则, 并且类似于Unix的一个的操作系统。
4、Redhat Linux操作系统
Red hat 企业简介 Red hat版本介绍
自考02326《操作系统》串讲笔记1
第一部分课程概述一、使用教材《操作系统》,全国高等教育自学考试指导委员会组编,谭耀铭主编,中国人民大学出版社2007年版。
二、课程简介随着计算机技术的迅速发展,计算机的硬、软件资源越来越丰富,用户也要求能更方便、更灵活地使用计算机系统。
为了增强计算机系统的处理能力以及方便用户有效地使用计算机系统,操作系统已成为现代计算机系统中不可缺少的重要组成部分。
因此,操作系统课程也就成为高等学校计算机专业的重要专业基础课程。
本课程从操作系统实现资源管理的观点出发,阐述如何对计算机系统中的硬、软件资源进行管理,使计算机系统协调一致地、有效地为用户服务,充分发挥资源的使用效率,提高计算机系统的可靠性和服务质量。
三、课程学习与考试要求在自学过程中、考生应掌握操作系统对各种资源的管理方法和操作系统各部分之间的联系,这样才能真正掌握操作系统的工作原理以及了解操作系统在整个计算机系统中的作用。
为了能确切地学好本课程,要求考生具备:高级语言程序设计、数据结构、计算机系统结构等课程的知识。
在学任何一门课程时,要能做到真正学有所得,就必须:认真阅读教材,边读边做笔记;及时做习题,巩固所学内容;做好阶段总结,正确理解课程内容。
但每一门课程都有自身的特殊性,对于具体课程来说,应按照课程的特点具体探讨如何进行学习。
要学好操作系统课程,关键在于弄清操作系统要做什么,怎么去做和为什么要这样去做。
所以,如能注意如下几点,将会对操作系统课程的自学起到促进作用。
(1)在开始阅读某一章教材之前,先翻阅大纲中有关这一章的考核知识点、考核要求、自学要求、重点,以便在阅读教材时做到心中有数,有的放矢。
(2)阅读教材时要逐段细读,逐句推敲,集中精力,吃透每一个知识点,对基本概念必须深刻理解,对基本原理必须彻底弄清,对设计技巧要能灵活运用。
(3)根据操作系统在计算机系统中的应用,你在学习操作系统课程时应围绕如下四个中心问题:①操作系统怎样管理计算机系统中的各种资源,以及保证资源的使用效率。
2022银行招聘科技岗试题及解析
1.在Linux中,通常把设备作为( )文件来处理。
A.特殊B.普通C.目录文件D.设备2.在 Linux 系统中获取帮助信息的命令为( )。
A.helpB.manC.catD.type3.在 Linux 系统中的 mv 命令表示( ) 。
A.删除文件B.移动文件或对文件换名C.复制文件D.撤销文件4.在UNIX系统中,复制文件采用的命令为( )。
A.cpB.mvC.rmD.copy5.一个进程刚被创建后,其初始状态为( )。
A.运行态B.等待态C.就绪态D.创建态1.【答案】A。
2.【答案】B。
3.【答案】B。
4.【答案】A。
5.【答案】C。
1.在大多数Linux发行版本中,以下哪个属于块设备(block devices)( )。
A.串行口B.硬盘C.虚拟终端D.打印机2.怎样更改一个文件的权限设置( )。
A.attribB.chmodC.changeD.file3.在使用了shadow口令的系统中,/etc/passwd和/etc/shadow 两个文件的权限正确的是( )。
A.-rw-r----- ,-r--------B.-rw-r--r-- , -r--r--r—C.-rw-r--r-- ,-r--------D.-rw-r--rw- , -r-----r—4.在Linux系统中的脚本文件一般以什么开头( )。
A.$/bin/shB.#!/bin/she /bin/shD.set shell=/bin/sh5.下面哪个命令可以压缩部分文件( )。
A.tar -dzvf filename.tgz *B.tar -tzvf filename.tgz *C.tar -czvf filename.tgz *D.tar -xzvf filename.tgz *1.【答案】B。
解析:块设备是I/O设备中的一类,是将信息存储在固定大小的块中,每个块都有自己的地址。
2.【答案】B。
解析:这是Linux系统管理员最常用到的命令之一,它用于改变文件或目录的访问权限。
uninx 时间校准命令 -回复
uninx 时间校准命令-回复"Unix时间校准命令"是Unix操作系统中用于校准系统时钟的命令。
时钟是操作系统中非常重要的组成部分,它用于跟踪系统时间,记录事件发生的顺序以及执行程序的计时等。
在Unix系统中,时钟的精度和准确性对于许多应用程序和系统任务的正确执行至关重要。
本文将介绍Unix系统中常用的时间校准命令,并提供一步一步的操作指南。
Unix系统中常用的时间校准命令主要包括"date"、"ntpdate"、"adjtime"和"hwclock"。
第一步:使用"date"命令设置或查看系统时间"date"命令是Unix系统中用于设置或查看系统时间的常用命令。
在命令行中输入以下命令,以查看当前系统时间:date该命令将输出当前时间和日期。
要设置系统时间,您可以使用以下命令格式:date MMDDHHMMYYYY.SS其中,MM代表月份,DD代表日期,HH代表小时,MM代表分钟,YYYY代表年份,SS代表秒。
例如,要将系统时间设置为2022年5月13日14点30分30秒,您可以使用以下命令:date 0513********.30请注意,为了更改系统时间,您需要root或超级用户权限。
第二步:使用"ntpdate"命令使用网络校准系统时间"ntpdate"命令允许您使用网络时间协议(NTP)服务器来校准系统时钟。
NTP是一种用于同步计算机时钟的协议,它可以从互联网上的时间服务器获取准确的时间信息。
要使用"ntpdate"命令,您可以在命令行中输入以下命令格式:ntpdate [NTP服务器地址]其中,[NTP服务器地址]是一个可选参数,用于指定要使用的NTP服务器。
如果不指定服务器地址,则命令将使用默认的NTP服务器。
IBM常用命令V1
1、文件系统:df –k2、设备:lsdev –C3、磁盘物理卷:lspv4、paging space:lsps –a5、配置:lscfg –vp6、软件:lslpp –l7、用户:who8、处理器个数:lsdev -Cgrep proc9、内存大小:lsattr -El mem01、shutdown使用 wall 命令提醒用户若干时间后关机;2、shutdown 22 分钟后关机3、shutdown -Fr-r 关机后重新启动1、显示错误:errpt2、显示详细的错误信息:errpt –a3、清空错误记录信息:errclear 0smitty tapesmitty usersmitty tcpipsmitty inetsmitty nfssmitty jfssmitty lvm1、显示卷组:列出卷组细节:lsvg列出卷组中的逻辑卷:lsvg -l列出卷组中的物理卷:lsvg -p2、增加卷组:smitty mkvg3、修改卷组属性:smitty chvg4、激活卷组:varyonvg vg_name5、解除卷组:varyoffvg vg_name6、向卷组中增加一个物理卷:extendvg vg_name hdiskn 注:extendvg 命令用于向已存在的卷组增加新的物理卷,这个物理卷设备的必须是可用的Available。
7、从卷组中删除一个物理卷:reducevg -d vg_name hdiskn 注:删除物理卷时其所在的卷组必须处于非活动,如果被删除的物理卷是卷组中仅存的一个,那么这个卷组同时也被删除。
1、lspv 列出物理卷名称:lspv 列出物理卷细节:lspv hdiskN 列出物理卷中的逻辑卷:lspv -l hdiskN列出物理卷中的物理分区分布:lspv -p hdiskN2、增加物理卷:cfgmgr /mkdev3、删除物理卷:rmdev1、显示逻辑卷信息列出逻辑卷名称:lslv -l列出逻辑卷细节:lslv列出与逻辑卷相关的物理卷:lslv –l列出物理卷中物理分区的分配:lslv –p显示逻辑卷中 LP逻辑分区与 PP物理分区的对应:lslv -m2、增加逻辑卷smitty mklvmklv3、删除逻辑卷smitty rmlv rmlv4、设置逻辑卷属性smitty lvsc chlv5、增加逻辑卷拷贝:smitty mklvcopy6、删除逻辑卷拷贝:smitty rmlvcopy1、cfgmgr/mkdev:配置系统中新增设备。
操作系统常用命令(实验一)
(一)UNIX常用命令和权限的使用实验目的1、熟悉UNIX系统的登录和退出。
2、了解UNIX的命令及使用格式。
3、熟悉UNIX/LINUX的常用基本命令。
实验内容1、学习如何登录UNIX。
2、熟悉UNIX/LINUX的常用基本命令如ls、who、w、pwd、ps、pstree、top等。
实验准备预习附录一《UNIX/LINUX简介》实验指导一、UNIX的登录与退出1、登录由于LINUX是一个多用户操作系统,可以有多个用户同时使用一台计算机。
运行各自的应用程序。
为了区分各个用户,每个用户都拥有自己独立的用户帐号。
用户在使用LINUX时都必须以自己的用户名进行登录。
登录提示为:login:在bash shell下“#”为root用户的命令行提示符,“$”为一般用户的命令行提示符。
(2)步骤login:(输入username)password:(输入密码)2、退出在UNIX系统提示符$下,输入logout、exit或shutdown 或按CTRL+ALT+DEL退出系统。
例:$ logout3、关闭系统LINUX与WINDOWS9X相似,在不使用计算机时应该先关闭系统,再关机。
关机一般由root用户进行。
关机的方法:halt或shutdown。
二、UNIX命令格式命令[选项] [处理对象]例:ls -la mydir注意:(1)命令一般是小写字串。
注意大小写有别(2)选项通常以减号(-)再加上一个或数个字符表示,用来选择一个命令的不同操作(3)同一行可有数个命令,命令间应以分号隔开(4)命令后加上&可使该命令后台(background)执行1、man获取命令帮助功能:查阅指定命令或资源联机手册。
语法:man 〈command〉说明:man是帮助手册manul的缩写,它的命令格式是man后跟需获取帮助的命令,显示过程中随时可用q退出。
示例:man ls2、用 - -help获取命令参数的说明功能:查阅指定命令所用的参数。
unix常用命令的英文全称
man:Manual 意思是手册,可以用这个命令查询其他命令的用法
pwd:print working directory 意思是打印当前路径
cd : change directory 切换目录
ls :list file 列出目录下的文件
su : swith user 切换用户
uname: Unix name 系统名称
df : disk free 空余硬盘
du :disk usage 硬盘使用率
lsmod: list modules 列表模块
mv :move file 移动文件
rm :remove file 删除文件
cp :copy file 复制文件
ln :link file 链接文件
所以命名为“dd”
tar :tape archive解压文件
ldd :list dynamic dependencied 列出动态相依
insmod :install modual 安装模块
rmmod :remove moduel 删除模块
lsmod :list module 列表模块
fg :foreground 前景
bg :background 背景
chown :change owner 改变所以者
chgrp : change group 改变用户组
chmod :change mode 改变模式
umoun应该根据其功能描述"convert a copy"命名为"cc",但"cc"已经被用以代表“c compiler”,
ps :process status 进程状态
UNIX网络编程卷1,套接字联网API(第3版)(中文版)(Stun
UNIX网络编程.卷1,套接字联网API(第3版)(中文版)(Stun UNIX网络编程.卷1,套接字联网API(第3版)(中文版)(StunUNIX网络编程.卷1,套接字联网API(第3版)(中文版)(StunUNIX网络编程.卷1,套接字联网API(第3版)(中文版)(Stevens典范著作,两位顶级网络编程专家应邀执笔订正)基础新闻原书名:unix网络编程 chm。
UnixNetworkProgramming,Volume1:TheSocketsNetworkingAPI(3rdEdition)原出版社:你看java网络编程技术。
Addison-WesleyProfessional作者:(美)W.RichardStevensBillFennerAndrewM.Rudoff丛书名:linux网络编程。
图灵计算机迷信丛书出版社:我不知道计算机网络编程技术。
百姓邮电出版社ISBN上架光阴:unix网络编程 chm。
2010-6-28出版日期:听说stun。
2010年6月开本:16开页码:听听unix网络编程 卷2。
804更多精华周详信息请审查:你知道计算机网络编程技术。
更有精彩样张抢先试读:unix网络编程 osock_cmp_addr形式简介这是一部传世之作!顶级网络编程专家BillFenner和AndrewM.Rudoff应邀执笔,事实上UNIX网络编程。
对W.RichardStevens的经典作品实行修订。
java网络编程 pdf。
书中吸纳了近几年网络技术的进展,卷1。
扩充了IPv6、SCTP协议和密钥管理套接字等外容,java网络编程技术。
深刻谈论了最新的关键轨范、实行和技术。
书中的全盘示例都是在UNIX编制上测试议定的的确的、可运转的代码,卷1。
承受了Stevens继续强调的理念:“练习网络编程的最好方法就是下载这些程序,看看java网络游戏编程。
其实unix。
对其进行改正和更正。
听说编程。
第1章UNIX和Linux操作系统概述
第1章UNIX和Linux操作系统概述一谈到Linux就不得不谈到UNIX,因为Linux是从UNIX发展而来的。
Linux本身也是UNIX系统大家族中的一员。
毫无疑问,UNIX和Linux在目前和可以预见的将来都是最有影响的计算机操作系统。
UNIX和Linux系统被广泛地应用到大中企业级服务器和Web 服务器上,它们已经成为了当今的主流操作系统。
1.1 什么是UNIXUNIX是一个计算机操作系统,一个用来协调、管理和控制计算机硬件和软件资源的控制程序。
UNIX操作系统是一个多用户和多任务操作系统:多用户表示在同一时刻可以有多个用户同时使用UNIX操作系统而且他们互不干扰;多任务表示任何用户在同一时间可以在UNIX操作系统上运行多个程序。
与Windows操作系统不同的是UNIX主要的用户界面是命令行界面(UNIX也有图形界面),用户通过UNIX系统提供的命令来操作计算机系统。
UNIX一共有大约250多个命令,但是常用的很少。
Windows被称为用户友好的操作系统,因为普通用户很容易学习和使用。
UNIX被称为程序员友好的操作系统,因为程序员可以方便地重新配置UNIX操作系统使之适应于自己的工作环境。
UNIX系统不但可以使用在大中型计算机、小型计算机、工作站上,随着微型机的功能不断提高和Internet的发展,UNIX(特别是Linux)系统也越来越多地使用在微机上。
UNIX 得到企业的广泛应用的主要原因是该系统的功能强大、可靠性高、技术成熟、网络功能强大、开放性好等特点。
Linux被广泛地应用于Web服务器的另一个非常重要的原因是其成本非常低廉(应该是最低的),因为绝大多数Linux软件是免费的。
1.2 UNIX的简要发展史UNIX操作系统的诞生本身就是一个传奇。
事情可以追溯到20世纪60年代末期,当时美国麻省理工学院(MIT)、AT&T公司的贝尔(Bell)实验室和通用电气公司(GE)联合研发一个叫做Multics(Multiplexed Information and Computing System)的操作系统。
清华大学UNIX讲义第7章-1
UNIX的命令size可以列出程序文件或者编译产生的 目标文件(文件名后缀一般为.o)中相应段的大小。 用法为: size filename-list 【例7-1】 使用size命令观察可执行程序文件的指令 段和数据段大小。 下面是size命令执行的例子,观察程序文件grep, awk,cat,more的指令段和数据段大小。text指的 是指令段。data指的是初始化的只读型数据区和初 始化的读写型数据区两部分。exec系统调用加载新 程序时,会根据程序文件中记载的bss段大小,分 配内存并将这个区域初始化清为0。dec和hex分别 是这三个部分空间之和的十进制和十六进制表示。
一个进程PCB中还含有许多进程的属性,比如:当 前目录,记录当前目录的i-节点,已经打开的文件 描 述 符 表 , umask值 , 进 程 PID, 等 等 。 进 程 的 PID是一个整数,系统中所有的进程的PID号都不 同,系统用这个编号标识一个进程。传统的UNIX 把这些进程属性组织成user结构和proc结构,在 <sys/user.h>文件和<sys/proc.h>文件中给出了定义, 在内核中对应这样的两个存储空间。把PCB分成两 部分的原因是proc结构中存放进程的基本数据, user结构中的内容是只有进程运行时才使用的部分, 内存紧张时可以暂时淘汰到外存。进程不能直接存 取和修改它的系统数据,因为进程的系统数据在内 核里,系统调用可用来访问或修改这些属性,如 chdir、umask、open和 close等。
图7-1列出了进程逻辑地址空间的布局,数据段分 成了四部分。 初始化的只读型数据存放C语言程序中的字符串常 数和其他只读型数据,例如:常常出现在printf第 一个函数参数的格式字符串。编译程序把所有的字 符串常数搜集在一起,字符串以一个挨一个的紧凑 方式存放在这个区域,这个区域不许写。安排只读 型数据和只允许读的指令段紧挨在一起,便于对它 们实施只读型存储保护。但是许多系统在实现时对 只读型数据区不施行写保护,但对指令段实施写保 护。初始化的读写型数据,例如:int a[10]={23, 67,89 };赋了初值的全局或静态变量。这两部分和 指令段从程序文件中获得。
1 什么是Bash 什么是Shell
1 什么是Bash 什么是ShellBash 是GNU Bourne-Again SHell,是目前大多数Linux发行版采用的Shell。
Shell 是*nix提供给用户使用的界面。
一个操作系统的底层是独立运行的,用户界面和底层分开,可以最大限度的保证系统稳定。
Shell就是一个特殊的程序,负责接受用户的命令,并把系统的响应返回给用户。
Bash Shell一般不需要自己安装,在安装发行版的同时都会安装好。
Shell的存在是和登陆相关的,从用户名密码验证通过以后,Shell就启动了,知道你退出,Shell就结束了运行。
除了Bash Shell之外,还有很多其他的Shell。
2 Linux的文件、目录、程序Linux的文件、目录、程序是使用bash操作的主要对象。
有必要事先了解一下文件、目录和程序的概念文件Linux中一切都是文件、普通的文件、设备文件、管道也是文件的形式。
一切操作都是文件为基础的。
DOS操作系统早期也是模拟这种方式,不过有很多漏洞(比如C:concon会蓝屏)文件是有属性的,有一个属性表示这个文件是不是目录,有3个属性表示这个文件的访问权限,还有一些表示从这个文件派生出的文件属性。
目录目录是管理文件的手段,不同的文件要分门别类才容易找到。
严格的说,目录也是一种文件,是具有目录属性的文件。
文件和目录都有所有者和所有组。
叫UID和GID,对应的,有3个属性表示相应的权限。
后面写到ls和chmod有详细地说明。
程序程序是可以执行的代码,有些是直接交给内核或者CPU执行的,有些是通过其他程序执行的(解释脚本),可以运行的程序都有一个可执行的属性。
3 简单的命令ls cp mv mkdir rm chown chmod前面说了一些枯燥的概念,现在趁着看官还没有烦躁,开始实际操作的例子。
QUOTE:Last login: Mon Aug 14 21:52:47 2006 from 61.149.202.143[root@CERNET ~]#这就是bash登陆后的样子。
UNIX_BASIC 第1章 UNIX操作系统概述
doswindowsunixlinuxmacosvxworks12unix操作系统的历史fernandojcorbato教授主持世界上第一个分时系统ctsscompatibletimesharingsystem1964年贝尔实验室mit和ge共同参与研发multicsmultiplexedinformationcomputingsystem多路信息与计算系统第二代分时系统设计目标是支持大规模的计算能够连接1000部终端机支持300的用户同时上线fernandojcorbatounix操作系统的历史2从事multics研究的kenthompson在pdp7计算机上用汇编语言实现了unics系统unix的原uniplexedinformationcomputingsystem在移植过程中dennisritchie用c语言改写了unics最终发布了unix的正式版本dennisritchie在thompson的b语言基础上发明了c语言从这以后大部分的操作系统都是用c语言写的kenthompsondennisritchiepdp11kendennisunix两大派系贝尔实验室unixsystemrelease42svr42现今的aixscounix等计算机系统研究小组csrg的bsdunixberkeleysoftwaredistributions现今的freebsdsolaris等工作站上的unix一般属于这一派系linux的历史麻省理工学院richardstallman荷兰andrewtanenbaum芬兰linustorvalds基于intel80386体系结构的操作系统内核加上gnu的bashgcc等其他软件unixhistoryaix的历史1986年ibm发布aix1操作系统安装在ibm6150微计算系统microcomputersystem1989年aixps2intel386pc版本1990aix3ibmrs6000小型机版本2000年aix5l同时支持power和itanium处理器2007年aix6和ibmpower处理器同步推出13unix的概念狭义的概念提供文件系统的管理功能unix的概念2广义的概念unix不仅指系统内核它是一个应用环境和程序设计环境提供了丰富的软件开发工具包括编辑器编译程序调试工具数据库等等功能强大的多任务多用户的操作系统unix的标准化由于世界中存在多种unix操作系统国际标准
一个简单的shell(在Unix系统下创建进程和管理进程)
设计一:设计任务:实现一个简单的shell(命令行解释器),类似于bash, csh等。
本设计的主要目的在于学会如何在Unix系统下创建进程和管理进程。
要求实现的shell支持以下内部命令:1. cd <目录>更改当前的工作目录到另一个<目录>。
如果<目录>未指定,输出当前工作目录。
如果<目录>不存在,要求有适当的错误信息提示。
改命令应能够改变PWD的环境变量。
2. environ列出所有环境变量字符串的设置(类似于Unix系统下的env命令)。
3. echo <内容>显示echo后的内容且换行。
4. help简短概要地输出你的shell的使用方法和基本功能。
5. jobs输出shell当前的一系列子进程,要求提供子进程的命名和PID号。
6. quit, exit, bye退出shell。
所有的内部命令应当优于在$PATH中同名的程序。
任何非内部命令必须请求shell创建一个新进程,且该子进程执行指定的程序。
这个新进程必须继承shell的环境变量和指定的命令行参数。
要求实现的shell支持以下内部命令:1. Batch Processing 如果shell启动带有一个文件名作为参数,打开该文件并执行文件里所有命令。
待所有进程全部结束退出shell。
2. Debugging 提供-v选项,shell启动时打开此选项将在运行过程中输出若干调试信息。
在该模式下,shell应该显示所有被创建了的进程的PID号,通报已结束的子进程和传递给子进程的参数等。
3. Prompt (命令行提示符) 解释器打印$PS2作为提示符。
4. Background Processing 如果命令以符合&终止,在后台并发执行该程序。
Shell立即等待下一命令的输入,而不等待该程序的结束。
注:所有命令和参数由空格或tab符分隔。
实验代码#include <string.h>#include <stdlib.h>#include <conio.h>#include <stdio.h>#include <dir.h>#include <dos.h>#include <time.h>/*定义全局变量*/char root_dir[3];char pre_dir[255];char *cmd_line[255];char curuser[10];struct userinf{char username[10];char userpass[10];};/*函数申明*/void init();int login();int getcmd();void dir();void cd();void clear();void newdir();void deldir();void del();void copy();void cut();void account();void help();main(){init();while(1)/* 消息循环*/{switch(getcmd()){case 0:help();break;case 1:dir();break;case 2:cd();break;case 3:newdir();break;case 4:deldir();break;case 5:del();break;case 6:copy();break;case 7:cut();break;case 8:account();break;}}}void init()/* 程序初始化*/{if(login()==0){exit(0);}strcpy(pre_dir,"C:\\");/*设定当前目录*/clear();/* 清屏*/printf("S Shell-Above Windows XP [Ver 1.0]\n");printf("(C) Copyright 2007 stars_625.\n\n");getchar();/* 清空缓冲区*/}int login()/* 程序登陆*/{char name[10];char pass[10];int logintime=3;FILE *fp;struct userinf inf;while(logintime>0)/* 登陆错误超过三次自动退出*/{printf("Login:");scanf("%s",name);printf("Password:");scanf("%s",pass);if((fp=fopen("inf.dll","r"))==NULL){printf("Can't open inf.dll file!\n");printf("Press any key to exit...");getch();exit(0);}while(fread(&inf,sizeof(inf),1,fp)==1 && strcmp(ername,name)!=0){}fclose(fp);if(strcmp(ername,name)==0){if(strcmp(erpass,pass)==0){strcpy(curuser,ername);clear();return 1;}else{printf("Login error, Press any key to relogin!\n");getch();clear();}}else{printf("The user is not exist, Press any key to relogin!\n");getch();clear();}logintime--;}printf("Login error above three times, Press any key to exit!");getch();return 0;}int getcmd()/* 获得命令*/{int i=0,j=0,k=0;char buf[255];printf("%s>",pre_dir);/* 打印提示符*/fgets(buf, 255, stdin);cmd_line[j] = calloc(255, sizeof(char));while (buf[i] != '\n' && buf[i] != '\0')/* 命令分析*/{if (buf[i] != ' '){cmd_line[j][k] = buf[i];++k;}else{cmd_line[j + 1] = calloc(255, sizeof(char));k = 0;++j;}++i;}cmd_line[j + 1]=0;if(strcmp(cmd_line[0],"exit")==0){exit(0);}else if(strcmp(cmd_line[0],"/?")==0 || strcmp(cmd_line[1],"/?")==0) {return 0;}else if(strcmp(cmd_line[0],"dir")==0){return 1;}else if(strcmp(cmd_line[0],"cd")==0){return 2;}else if(strcmp(cmd_line[0],"newdir")==0){return 3;}else if(strcmp(cmd_line[0],"deldir")==0){return 4;}else if(strcmp(cmd_line[0],"del")==0){return 5;}else if(strcmp(cmd_line[0],"copy")==0){return 6;}else if(strcmp(cmd_line[0],"cut")==0){return 7;}else if(strcmp(cmd_line[0],"account")==0){return 8;}else if(cmd_line[0][1]==':'){strcpy(pre_dir,cmd_line[0]);strcat(pre_dir,"\\");}else if(strcmp(cmd_line[0],"clear")==0){clear();}else{printf("The command is not supported!\n");}}void dir()/* 列出文件及文件夹*/{struct ffblk ff;char filepath[255];strcpy(filepath,pre_dir);findfirst(strcat(filepath,"*.*"),&ff,FA_DIREC);if(ff.ff_attrib==16){printf("<DIR>\t");}else{printf(" \t");}printf("%s\n",ff.ff_name);while(findnext(&ff)==0){if(ff.ff_attrib==16){printf("<DIR>\t");}else{printf(" \t");}printf("%s\n",ff.ff_name);}}void cd()/* 改变当前目录*/{int i=0;struct ffblk ff;char filepath[255];strcpy(filepath,pre_dir);if(strcmp(cmd_line[1],"..")==0)/* 返回上一层目录*/ {while(filepath[i]!='\0'){i++;}if(filepath[i-2]!=':'){i=i-2;while(filepath[i]!='\\' && i>=2){i--;}filepath[i+1]='\0';strcpy(pre_dir,filepath);}}else if(strcmp(cmd_line[1],"\\")==0)/*返回根目录*/ {while(filepath[i]!='\\'){i++;}filepath[i+1]='\0';strcpy(pre_dir,filepath);}else{findfirst(strcat(filepath,"*.*"),&ff,FA_DIREC);while(strcmp(ff.ff_name,cmd_line[1])!=0){if(findnext(&ff)!=0){break;}}if(strcmp(ff.ff_name,cmd_line[1])==0){strcat(pre_dir,cmd_line[1]);strcat(pre_dir,"\\");}else{printf("Can't find the file!\n");}}}void clear(){clrscr();}void newdir(){strcpy(filepath,pre_dir);if(mkdir(strcat(filepath,cmd_line[1]))==0){printf("Make dir '%s' successfully!\n",cmd_line[1]);}else{printf("Make dir error!\n");}}void deldir(){char filepath[255];strcpy(filepath,pre_dir);if(rmdir(strcat(filepath,cmd_line[1]))==0){printf("Delete dir '%s' successfully!\n",cmd_line[1]);}else{printf("Delete dir error!\n");}}void del(){char filepath[255];strcpy(filepath,pre_dir);if(unlink(strcat(filepath,cmd_line[1]))==0){printf("Delete %s successfully!\n",cmd_line[1]);}else{printf("Delete error!\n");}}void copy(){char filepath[255];char sourcepath[255];FILE *newfp;FILE *oldfp;char ch;strcpy(filepath,pre_dir);if(cmd_line[1][1]!=':'){strcpy(sourcepath,filepath);strcat(sourcepath,cmd_line[1]);}else{strcpy(sourcepath,cmd_line[1]);}if(cmd_line[2][1]!=':'){strcpy(aimpath,filepath);strcat(aimpath,cmd_line[2]);}else{strcpy(aimpath,cmd_line[2]);}if((oldfp=fopen(sourcepath,"r"))==NULL){printf("Can't open old file!\n");}if((newfp=fopen(aimpath,"w"))==NULL){printf("Can't creat new file!\n");}while((ch=fgetc(oldfp))!=EOF){fputc(ch,newfp);}fclose(oldfp);fclose(newfp);printf("Copy from %s to %s successfully!\n",sourcepath,aimpath); }void cut(){char filepath[255];char sourcepath[255];char aimpath[255];FILE *newfp;FILE *oldfp;char ch;strcpy(filepath,pre_dir);if(cmd_line[1][1]!=':'){strcpy(sourcepath,filepath);strcat(sourcepath,cmd_line[1]);}else{strcpy(sourcepath,cmd_line[1]);}if(cmd_line[2][1]!=':'){strcpy(aimpath,filepath);strcat(aimpath,cmd_line[2]);}else{strcpy(aimpath,cmd_line[2]);}if((oldfp=fopen(sourcepath,"r"))==NULL){printf("Can't open old file!\n");}if((newfp=fopen(aimpath,"w"))==NULL){printf("Can't creat new file!\n");}while((ch=fgetc(oldfp))!=EOF){fputc(ch,newfp);}fclose(oldfp);fclose(newfp);if(unlink(sourcepath)==0){printf("Cut from %s to %s successfully!\n",sourcepath,aimpath); }else{printf("Delete old file error!\n");}}void account(){FILE *fp;struct userinf inf;if(strcmp(cmd_line[1],"/add")==0){if((fp=fopen("inf.dll","r+"))==NULL){printf("Can't open inf.dll file!\n");printf("Press any key to exit...");getch();}while(fread(&inf,sizeof(inf),1,fp)==1 && strcmp(ername,cmd_line[2])!=0){}if(strcmp(ername,cmd_line[2])==0){printf("Create user error, the user is exist!\n");}else{strcpy(ername,cmd_line[2]);strcpy(erpass,cmd_line[3]);if(fwrite(&inf,sizeof(inf),1,fp)==1){printf("Create user %s successfully!\n",ername);}else{printf("Create user error!\n");}}fclose(fp);}else if(strcmp(cmd_line[1],"/edit")==0){if((fp=fopen("inf.dll","r+"))==NULL){printf("Can't open inf.dll file!\n");printf("Press any key to exit...");getch();}while(fread(&inf,sizeof(inf),1,fp)==1 && strcmp(ername,cmd_line[2])!=0){}if(strcmp(ername,cmd_line[2])!=0){printf("Edit user error, the user is not exist!\n");}else{strcpy(ername,cmd_line[2]);strcpy(erpass,cmd_line[3]);fseek(fp,-20L,1);if(fwrite(&inf,sizeof(inf),1,fp)==1){printf("Edit user %s successfully!\n",ername);}else{printf("Edit user error!\n");}}fclose(fp);}else{printf("Please enter correct parameter,type /? for help!\n");}}void help(){if(strcmp(cmd_line[0],"/?")==0){printf("The list of commands.\n\n");printf(" dir\t\tList the files and dirs.\n");printf(" cd\t\tChange the dir.\n");printf(" clear\t\tClear the screen.\n");printf(" newdir\tMake a dir.\n");printf(" deldir\tDelete a dir.\n");printf(" del\t\tDelete a file.\n");printf(" copy\t\tCopy a file from a place to another.\n");printf(" cut\t\tCut a file from a place to another.\n");printf(" account\tAdd edit or delete a account.\n\n");printf("For more information add type /? after command.\n\n");printf("Notice:All the command line is capitalization distinction!\n\n"); }else{if(strcmp(cmd_line[0],"dir")==0){printf("List the files and dirs.\n\n");printf("dir path\n\n");printf(" path\t\tThe dir you want to list.\n");printf(" \t\tif path is NULL then list the current dir.\n\n");}else if(strcmp(cmd_line[0],"cd")==0){printf("Change the dir.\n\n");printf("cd < \\ | .. | path>\n\n");printf(" \\\t\tReturn to the root dir.\n");printf(" ..\t\tReturn to the parent dir.\n");printf(" path\t\tThe dir you want change to.\n\n");}else if(strcmp(cmd_line[0],"clear")==0){printf("Clear the screen.\n\n");printf("clear\n\n");}else if(strcmp(cmd_line[0],"newdir")==0){printf("Make a dir.\n\n");printf("newdir path\n\n");printf(" path\t\tThe dir path which you want to create.\n\n");}else if(strcmp(cmd_line[0],"deldir")==0){printf("Delete a dir.\n\n");printf("deldir path\n\n");printf(" path\t\tThe dir path which you want to delete.\n\n");}else if(strcmp(cmd_line[0],"del")==0){printf("Delete a file.\n\n");printf("del filepath\n\n");printf(" filepath\tThe filepath which you want to delete.\n\n");}else if(strcmp(cmd_line[0],"copy")==0){printf("Copy a file from a place to another.\n\n");printf("copy source aim\n\n");printf(" source\tThe source file path.\n");printf(" aim\t\tThe aim file path.\n\n");}else if(strcmp(cmd_line[0],"cut")==0){printf("Cut a file from a place to another.\n\n");printf("cut source aim\n\n");printf(" source\tThe source file path.\n");printf(" aim\t\tThe aim file path.\n\n");}else if(strcmp(cmd_line[0],"account")==0){printf("Add edit or delete a account.\n\n");printf("account < /add | /edit | /del > username userpass\n\n");printf(" username\tThe account name.\n");printf(" userpass\tThe account password.\n");printf(" /add\t\tAdd a account.\n");printf(" /edit\t\tEdit a account.\n");printf(" /del\t\tDelete a account.\n\n");}else{printf("The command is not supported!\n");}}}。
os 返回文件的上一级文件夹名
OS 是操作系统(Operating System)的缩写,它是计算机系统中最基础的软件之一。
在操作系统中,文件夹(或者叫目录)是一种用来组织和存储文件的数据结构。
在很多操作系统中,通过命令行或者编程语言可以方便地获取文件的信息,比如文件的上一级文件夹名。
在很多情况下,我们需要编写程序来处理文件系统中的文件,而获取文件的上一级文件夹名也是一个常见的需求。
下面,我们将介绍如何在几种常见的操作系统中,通过命令行或者编程语言来获取文件的上一级文件夹名。
1. Windows 系统在 Windows 系统中,我们可以通过命令行和批处理文件来获取文件的上一级文件夹名。
其中,可以使用 `cd` 命令来切换当前目录,使用`cd` 变量来获取当前目录的路径,使用 `~dp0` 变量来获取当前批处理文件所在的路径。
结合这些命令和变量,可以方便地获取文件的上一级文件夹名。
2. Linux 系统在 Linux 系统中,我们可以使用命令行工具来获取文件的上一级文件夹名。
其中,可以使用 `dirname` 命令来获取指定文件路径的上一级文件夹名,这个命令非常简单易用。
另外,也可以通过编程语言,比如 Python 或者 Shell 脚本,来实现同样的功能。
3. macOS 系统在 macOS 系统中,和 Linux 系统类似,我们可以使用命令行工具来获取文件的上一级文件夹名。
可以使用 `dirname` 命令来实现这个功能,在 macOS 系统中同样非常方便。
总结在操作系统中,获取文件的上一级文件夹名是一个常见的需求,我们可以通过简单的命令行工具或者编程语言来实现这个功能。
不同的操作系统可能有些许差异,但总体来说,这个功能都不难实现。
希望上面的介绍能帮助大家更好地理解操作系统中的文件系统相关的知识。
以上就是关于操作系统中获取文件的上一级文件夹名的介绍,希望对大家有所帮助。
谢谢阅读!很多操作系统提供了不同的方法来获取文件的上一级文件夹名,比如在 Windows、Linux 和 macOS 系统中,我们可以使用命令行工具或者编程语言来实现这个功能。
《Unix网络编程》第一卷第三版unp.h
/* include unph *//* Our own header. Tabs are set for 4 spaces, not 8 */#ifndef__unp_h#define__unp_h#include"../config.h"/* configuration options for current OS *//* "../config.h" is generated by configure */ /* If anything changes in the following list of #includes, must change acsite.m4 also, for configure's tests. */#include<sys/types.h>/* basic system data types */#include<sys/socket.h>/* basic socket definitions */#if TIME_WITH_SYS_TIME#include<sys/time.h>/* timeval{} for select() */#include<time.h>/* timespec{} for pselect() */#else#if HAVE_SYS_TIME_H#include<sys/time.h>/* includes <time.h> unsafely */#else#include<time.h>/* old system? */#endif#endif#include<netinet/in.h>/* sockaddr_in{} and other Internet defns */#include<arpa/inet.h>/* inet(3) functions */#include<errno.h>#include<fcntl.h>/* for nonblocking */#include<netdb.h>#include<signal.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/stat.h>/* for S_xxx file mode constants */#include<sys/uio.h>/* for iovec{} and readv/writev */#include<unistd.h>#include<sys/wait.h>#include<sys/un.h>/* for Unix domain sockets */#ifdef HAVE_SYS_SELECT_H# include<sys/select.h>/* for convenience */#endif#ifdef HAVE_SYS_SYSCTL_H#ifdef HAVE_SYS_PARAM_H# include<sys/param.h>/* OpenBSD prereq for sysctl.h */#endif# include<sys/sysctl.h>#endif#ifdef HAVE_POLL_H# include<poll.h>/* for convenience */#endif#ifdef HAVE_SYS_EVENT_H# include<sys/event.h>/* for kqueue */#endif#ifdef HAVE_STRINGS_H# include<strings.h>/* for convenience */#endif/* Three headers are normally needed for socket/file ioctl's:* <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>.*/#ifdef HAVE_SYS_IOCTL_H# include<sys/ioctl.h>#endif#ifdef HAVE_SYS_FILIO_H# include<sys/filio.h>#endif#ifdef HAVE_SYS_SOCKIO_H# include<sys/sockio.h>#endif#ifdef HAVE_PTHREAD_H# include<pthread.h>#endif#ifdef HAVE_NET_IF_DL_H# include<net/if_dl.h>#endif#ifdef HAVE_NETINET_SCTP_H#include<netinet/sctp.h>#endif/* OSF/1 actually disables recv() and send() in <sys/socket.h> */ #ifdef__osf__#undef recv#undef send#define recv(a,b,c,d) recvfrom(a,b,c,d,0,0)#define send(a,b,c,d) sendto(a,b,c,d,0,0)#endif#ifndef INADDR_NONE/* $$.Ic INADDR_NONE$$ */#define INADDR_NONE0xffffffff /* should have been in <netinet/in.h> */ #endif#ifndef SHUT_RD/* these three POSIX names are new */#define SHUT_RD0 /* shutdown for reading */#define SHUT_WR 1 /* shutdown for writing */#define SHUT_RDWR 2 /* shutdown for reading and writing *//* $$.Ic SHUT_RD$$ *//* $$.Ic SHUT_WR$$ *//* $$.Ic SHUT_RDWR$$ */#endif/* *INDENT-OFF* */#ifndef INET_ADDRSTRLEN/* $$.Ic INET_ADDRSTRLEN$$ */#define INET_ADDRSTRLEN16 /* "ddd.ddd.ddd.ddd\0"1234567890123456 */#endif/* Define following even if IPv6 not supported, so we can always allocate an adequately sized buffer without #ifdefs in the code. */#ifndef INET6_ADDRSTRLEN/* $$.Ic INET6_ADDRSTRLEN$$ */#define INET6_ADDRSTRLEN46 /* max size of IPv6 address string:"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx" or"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd\0"1234567890123456789012345678901234567890123456 */ #endif/* *INDENT-ON* *//* Define bzero() as a macro if it's not in standard C library. */#ifndef HAVE_BZERO#define bzero(ptr,n) memset(ptr, 0, n)/* $$.If bzero$$ *//* $$.If memset$$ */#endif/* Older resolvers do not have gethostbyname2() */#ifndef HAVE_GETHOSTBYNAME2#define gethostbyname2(host,family) gethostbyname((host))#endif/* The structure returned by recvfrom_flags() */struct unp_in_pktinfo {struct in_addr ipi_addr; /* dst IPv4 address */int ipi_ifindex;/* received interface index */};/* $$.It unp_in_pktinfo$$ *//* $$.Ib ipi_addr$$ *//* $$.Ib ipi_ifindex$$ *//* We need the newer CMSG_LEN() and CMSG_SPACE() macros, but few implementations support them today. These two macros really needan ALIGN() macro, but each implementation does this differently. */#ifndef CMSG_LEN/* $$.Im CMSG_LEN$$ */#define CMSG_LEN(size) (sizeof(struct cmsghdr) + (size))#endif#ifndef CMSG_SPACE/* $$.Im CMSG_SPACE$$ */#define CMSG_SPACE(size) (sizeof(struct cmsghdr) + (size))#endif/* POSIX requires the SUN_LEN() macro, but not all implementations DefinE it (yet). Note that this 4.4BSD macro works regardless whether there isa length field or not. */#ifndef SUN_LEN/* $$.Im SUN_LEN$$ */# define SUN_LEN(su) \(sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))#endif/* POSIX renames "Unix domain" as "local IPC."Not all systems DefinE AF_LOCAL and PF_LOCAL (yet). */#ifndef AF_LOCAL#define AF_LOCAL AF_UNIX#endif#ifndef PF_LOCAL#define PF_LOCAL PF_UNIX#endif/* POSIX requires that an #include of <poll.h> DefinE INFTIM, but many systems still DefinE it in <sys/stropts.h>. We don't want to includeall the STREAMS stuff if it's not needed, so we just DefinE INFTIM here.This is the standard value, but there's no guarantee it is -1. */#ifndef INFTIM#define INFTIM(-1) /* infinite poll timeout *//* $$.Ic INFTIM$$ */#ifdef HAVE_POLL_H#define INFTIM_UNPH/* tell unpxti.h we defined it */#endif#endif/* Following could be derived from SOMAXCONN in <sys/socket.h>, but many kernels still #define it as 5, while actually supporting many more */#define LISTENQ1024 /* 2nd argument to listen() *//* Miscellaneous constants */#define MAXLINE4096 /* max text line length */#define BUFFSIZE8192 /* buffer size for reads and writes *//* Define some port number that can be used for our examples */#define SERV_PORT9877 /* TCP and UDP */#define SERV_PORT_STR"9877"/* TCP and UDP */#define UNIXSTR_PATH"/tmp/unix.str"/* Unix domain stream */#define UNIXDG_PATH"/tmp/unix.dg"/* Unix domain datagram *//* $$.ix [LISTENQ]~constant,~definition~of$$ *//* $$.ix [MAXLINE]~constant,~definition~of$$ *//* $$.ix [BUFFSIZE]~constant,~definition~of$$ *//* $$.ix [SERV_PORT]~constant,~definition~of$$ *//* $$.ix [UNIXSTR_PATH]~constant,~definition~of$$ *//* $$.ix [UNIXDG_PATH]~constant,~definition~of$$ *//* Following shortens all the typecasts of pointer arguments: */#define SA struct sockaddr#ifndef HAVE_STRUCT_SOCKADDR_STORAGE/** RFC 3493: protocol-independent placeholder for socket addresses*/#define__SS_MAXSIZE128#define__SS_ALIGNSIZE(sizeof(int64_t))#ifdef HAVE_SOCKADDR_SA_LEN#define__SS_PAD1SIZE(__SS_ALIGNSIZE - sizeof(u_char) - sizeof(sa_family_t)) #else#define__SS_PAD1SIZE(__SS_ALIGNSIZE - sizeof(sa_family_t))#endif#define__SS_PAD2SIZE(__SS_MAXSIZE - 2*__SS_ALIGNSIZE)struct sockaddr_storage {#ifdef HAVE_SOCKADDR_SA_LENu_char ss_len;#endifsa_family_t ss_family;char__ss_pad1[__SS_PAD1SIZE];int64_t__ss_align;char__ss_pad2[__SS_PAD2SIZE];};#endif#define FILE_MODE(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)/* default file access permissions for new files */#define DIR_MODE(FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)/* default permissions for new directories */ typedef void Sigfunc(int); /* for signal handlers */#define min(a,b) ((a) < (b) ? (a) : (b))#define max(a,b) ((a) > (b) ? (a) : (b))#ifndef HAVE_ADDRINFO_STRUCT# include"../lib/addrinfo.h"#endif#ifndef HAVE_IF_NAMEINDEX_STRUCTstruct if_nameindex {unsigned int if_index; /* 1, 2, ... */char*if_name; /* null-terminated name: "le0", ... */ };/* $$.It if_nameindex$$ *//* $$.Ib if_index$$ *//* $$.Ib if_name$$ */#endif#ifndef HAVE_TIMESPEC_STRUCTstruct timespec {time_t tv_sec; /* seconds */long tv_nsec; /* and nanoseconds */};/* $$.It timespec$$ *//* $$.Ib tv_sec$$ *//* $$.Ib tv_nsec$$ */#endif/* end unph *//* prototypes for our own library functions */int connect_nonb(int, const SA *, socklen_t, int);int connect_timeo(int, const SA *, socklen_t, int);int daemon_init(const char *, int);void daemon_inetd(const char *, int);void dg_cli(FILE *, int, const SA *, socklen_t);void dg_echo(int, SA *, socklen_t);int family_to_level(int);char*gf_time(void);void heartbeat_cli(int, int, int);void heartbeat_serv(int, int, int);struct addrinfo *host_serv(const char *, const char *, int, int);int inet_srcrt_add(char *);u_char*inet_srcrt_init(int);void inet_srcrt_print(u_char *, int);void inet6_srcrt_print(void *);char**my_addrs(int *);int readable_timeo(int, int);ssize_t readline(int, void *, size_t);ssize_t readn(int, void *, size_t);ssize_t read_fd(int, void *, size_t, int *);ssize_t recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,struct unp_in_pktinfo *);Sigfunc *signal_intr(int, Sigfunc *);int sock_bind_wild(int, int);int sock_cmp_addr(const SA *, const SA *, socklen_t);int sock_cmp_port(const SA *, const SA *, socklen_t);int sock_get_port(const SA *, socklen_t);void sock_set_addr(SA *, socklen_t, const void *);void sock_set_port(SA *, socklen_t, int);void sock_set_wild(SA *, socklen_t);char*sock_ntop(const SA *, socklen_t);char*sock_ntop_host(const SA *, socklen_t);int sockfd_to_family(int);void str_echo(int);void str_cli(FILE *, int);int tcp_connect(const char *, const char *);int tcp_listen(const char *, const char *, socklen_t *);void tv_sub(struct timeval *, struct timeval *);int udp_client(const char *, const char *, SA **, socklen_t *);int udp_connect(const char *, const char *);int udp_server(const char *, const char *, socklen_t *);int writable_timeo(int, int);ssize_t writen(int, const void *, size_t);ssize_t write_fd(int, void *, size_t, int);#ifdef MCASTint mcast_leave(int, const SA *, socklen_t);int mcast_join(int, const SA *, socklen_t, const char *, u_int);int mcast_leave_source_group(int sockfd, const SA *src, socklen_t srclen,const SA *grp, socklen_t grplen);int mcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,const SA *grp, socklen_t grplen,const char *ifname, u_int ifindex);int mcast_block_source(int sockfd, const SA *src, socklen_t srclen,const SA *grp, socklen_t grplen);int mcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,const SA *grp, socklen_t grplen);int mcast_get_if(int);int mcast_get_loop(int);int mcast_get_ttl(int);int mcast_set_if(int, const char *, u_int);int mcast_set_loop(int, int);int mcast_set_ttl(int, int);void Mcast_leave(int, const SA *, socklen_t);void Mcast_join(int, const SA *, socklen_t, const char *, u_int);void Mcast_leave_source_group(int sockfd, const SA *src, socklen_t srclen,const SA *grp, socklen_t grplen);void Mcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,const SA *grp, socklen_t grplen,const char *ifname, u_int ifindex);void Mcast_block_source(int sockfd, const SA *src, socklen_t srclen,const SA *grp, socklen_t grplen);void Mcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,const SA *grp, socklen_t grplen);int Mcast_get_if(int);int Mcast_get_loop(int);int Mcast_get_ttl(int);void Mcast_set_if(int, const char *, u_int);void Mcast_set_loop(int, int);void Mcast_set_ttl(int, int);#endifuint16_t in_cksum(uint16_t *, int);#ifndef HAVE_GETADDRINFO_PROTOint getaddrinfo(const char *, const char *, const struct addrinfo *,struct addrinfo **);void freeaddrinfo(struct addrinfo *);char*gai_strerror(int);#endif#ifndef HAVE_GETNAMEINFO_PROTOint getnameinfo(const SA *, socklen_t, char *, size_t, char *, size_t, int); #endif#ifndef HAVE_GETHOSTNAME_PROTOint gethostname(char *, int);#endif#ifndef HAVE_HSTRERROR_PROTOconst char*hstrerror(int);#endif#ifndef HAVE_IF_NAMETOINDEX_PROTOunsigned int if_nametoindex(const char *);char*if_indextoname(unsigned int, char *);void if_freenameindex(struct if_nameindex *); struct if_nameindex *if_nameindex(void);#endif#ifndef HAVE_INET_PTON_PROTOint inet_pton(int, const char *, void *);const char*inet_ntop(int, const void *, char *, size_t);#endif#ifndef HAVE_INET_ATON_PROTOint inet_aton(const char *, struct in_addr *);#endif#ifndef HAVE_PSELECT_PROTOint pselect(int, fd_set *, fd_set *, fd_set *,const struct timespec *, const sigset_t *);#endif#ifndef HAVE_SOCKATMARK_PROTOint sockatmark(int);#endif#ifndef HAVE_SNPRINTF_PROTOint snprintf(char *, size_t, const char *, ...);#endif/* prototypes for our own library wrapper functions */ void Connect_timeo(int, const SA *, socklen_t, int);int Family_to_level(int);struct addrinfo *Host_serv(const char *, const char *, int, int); const char*Inet_ntop(int, const void *, char *, size_t); void Inet_pton(int, const char *, void *);char*If_indextoname(unsigned int, char *);unsigned int If_nametoindex(const char *);struct if_nameindex*If_nameindex(void);char**My_addrs(int *);ssize_t Read_fd(int, void *, size_t, int *);int Readable_timeo(int, int);ssize_t Recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *, struct unp_in_pktinfo *);Sigfunc *Signal(int, Sigfunc *);Sigfunc *Signal_intr(int, Sigfunc *);int Sock_bind_wild(int, int);char*Sock_ntop(const SA *, socklen_t);char*Sock_ntop_host(const SA *, socklen_t);int Sockfd_to_family(int);int Tcp_connect(const char *, const char *);int Tcp_listen(const char *, const char *, socklen_t *);int Udp_client(const char *, const char *, SA **, socklen_t *);int Udp_connect(const char *, const char *);int Udp_server(const char *, const char *, socklen_t *);ssize_t Write_fd(int, void *, size_t, int);int Writable_timeo(int, int);/* prototypes for our Unix wrapper functions: see {Sec errors} */ void*Calloc(size_t, size_t);void Close(int);void Dup2(int, int);int Fcntl(int, int, int);void Gettimeofday(struct timeval *, void *);int Ioctl(int, int, void *);pid_t Fork(void);void*Malloc(size_t);int Mkstemp(char *);void*Mmap(void *, size_t, int, int, int, off_t);int Open(const char *, int, mode_t);void Pipe(int *fds);ssize_t Read(int, void *, size_t);void Sigaddset(sigset_t *, int);void Sigdelset(sigset_t *, int);void Sigemptyset(sigset_t *);void Sigfillset(sigset_t *);int Sigismember(const sigset_t *, int);void Sigpending(sigset_t *);void Sigprocmask(int, const sigset_t *, sigset_t *);char*Strdup(const char *);long Sysconf(int);void Sysctl(int *, u_int, void *, size_t *, void *, size_t);void Unlink(const char *);pid_t Wait(int *);pid_t Waitpid(pid_t, int *, int);void Write(int, void *, size_t);/* prototypes for our stdio wrapper functions: see {Sec errors} */ void Fclose(FILE *);FILE*Fdopen(int, const char *);char*Fgets(char *, int, FILE *);FILE*Fopen(const char *, const char *);void Fputs(const char *, FILE *);/* prototypes for our socket wrapper functions: see {Sec errors} */ int Accept(int, SA *, socklen_t *);void Bind(int, const SA *, socklen_t);void Connect(int, const SA *, socklen_t);void Getpeername(int, SA *, socklen_t *);void Getsockname(int, SA *, socklen_t *);void Getsockopt(int, int, int, void *, socklen_t *);#ifdef HAVE_INET6_RTH_INITint Inet6_rth_space(int, int);void*Inet6_rth_init(void *, socklen_t, int, int);void Inet6_rth_add(void *, const struct in6_addr *);void Inet6_rth_reverse(const void *, void *);int Inet6_rth_segments(const void *);struct in6_addr *Inet6_rth_getaddr(const void *, int);#endif#ifdef HAVE_KQUEUEint Kqueue(void);int Kevent(int, const struct kevent *, int,struct kevent *, int, const struct timespec *);#endifvoid Listen(int, int);#ifdef HAVE_POLLint Poll(struct pollfd *, unsigned long, int);#endifssize_t Readline(int, void *, size_t);ssize_t Readn(int, void *, size_t);ssize_t Recv(int, void *, size_t, int);ssize_t Recvfrom(int, void *, size_t, int, SA *, socklen_t *);ssize_t Recvmsg(int, struct msghdr *, int);int Select(int, fd_set *, fd_set *, fd_set *, struct timeval *);void Send(int, const void *, size_t, int);void Sendto(int, const void *, size_t, int, const SA *, socklen_t);void Sendmsg(int, const struct msghdr *, int);void Setsockopt(int, int, int, const void *, socklen_t);void Shutdown(int, int);int Sockatmark(int);int Socket(int, int, int);void Socketpair(int, int, int, int *); void Writen(int, void *, size_t); void err_dump(const char *, ...); void err_msg(const char *, ...); void err_quit(const char *, ...); void err_ret(const char *, ...); void err_sys(const char *, ...);#endif/* __unp_h */。
export命令用法
export命令用法一、export命令基本用法在类Unix系统(如Linux和macOS)中,`export`命令主要用于设置环境变量,使得这些变量能够在当前 shell 及其子shell中被访问。
1. 设置单个变量- 例如,如果你想设置一个名为`MY_VAR`的环境变量,并且给它赋值为`hello world`,你可以使用以下命令:- `export MY_VAR="hello world"`。
这就像是给一个盒子贴上了标签`MY_VAR`,然后把`hello world`这个东西放进了盒子里,这样系统里的其他程序如果知道怎么找这个盒子,就能拿到里面的东西了。
- 在脚本中,假设你有一个脚本文件`test.sh`,内容如下:- ```bash#!/bin/bashexport MY_COLOR="blue"echo "The color is $MY_COLOR in this shell."bash -c 'echo "The color is $MY_COLOR in the sub - shell too."'```- 当你运行`./test.sh`时,你会看到在主shell和子shell中都能访问到`MY_COLOR`这个环境变量,就好像这个变量的影响力从一个房间(主shell)扩散到了它里面的小房间(子shell)一样。
2. 设置多个变量- 你可以在一行中设置多个变量,例如:- `export VAR1="value1" VAR2="value2"`。
这有点像你一次给好几个盒子贴上标签并且放进不同的东西,然后系统里的程序就可以根据需要去找到对应的盒子拿东西了。
3. 查看已设置的环境变量- 使用`export -p`命令。
这就像是打开一个仓库的清单,看看都有哪些贴着标签(变量名)的盒子(变量值)已经放在那里了。
unix1 UNIX教程[1]
清华大学计算机与信息管理中心
UNIX的结构
用户
实用程序
SHELL
内核 硬件
清华大学计算机与信息管理中心 • 登录与退出 • /etc/passwd
wuhp:*:103:100:WuHaiping:/home/wuhp:/bin/csh 口令:密码:用户号:用户组:用户描述:主目录:shell
• • • •
清华大学计算机与信息管理中心 • 多用户文件系统的访问许可 • ls -l ls • -r-xr-xr-x 1 bin bin 18120 1998 10月 6 ls 文件类型 连接数 用户名 组名 大小 时间 • 第一个字符表示文件类型例如: • b表示块文件、d表示目录 • c表示字符文件、p是一个管道文件 • l表示连接文件、s是一个套接字文件
清华大学计算机与信息管理中心 • • • • • • • • • 列文件名 ls [options] names -a显示以.开头的隐藏文件 -d显示目录 -l显示详细信息 -r以逆序排列 -R递归列出子目录及文件信息 -t以修改时间为序 -u以访问时间为序
清华大学计算机与信息管理中心 • • • • • • • • • 对文件按行进行排序 sort [options] filename -b 忽略开头的空格和制表符 -f 不区分大小写 -n 按数字从小到大的顺序排序 -r 按当前排序规则逆序排序 -u 排序时忽略重复的行 -o 指定输出文件名 -k start stop 规定排序关键字的列范围
清华大学计算机与信息管理中心 • 例如: • sort filea对文件filea进行排序 • sort -nr myfile对myfile中的字段从大到小 的顺序进行排序,并且是逆排序 • sort -k 2,2 myfile按照第二个字段对myfile 文件进行排序
UNIX系统开发-链接处理(1)
UNIX系统开发-链接处理(1)我们已经知道链接实际上是指将在一个模块中引用的符号与它在另一个模块中的定义相链接的过程。
并且我们还知道链接分为动态链接和静态链接两种方式。
不论是对哪一种方式。
链接程序都将搜索程序中的每一个模块,包括所用到的每一个库文件,以在这些文件中寻找在某个模块中没有定义的外部符号的定义。
如果没有找到某个被引用的符号的定义,链接程序将报告错误。
此时可执行文件的创建将会失败。
对于静态链接和动态链接,其区别主要在于搜索到某个符号的定义后链接程序所做的不同工作:对静态链接,链接程序将把静态链接库(档案库)中哪些被用户程序所引用的符号定义的目标代码,拷贝到最终生成的可执行文件中。
这种情况下,程序中的外部符号引用同其定义的链接是在可执行文件被建立的时候完成的。
对动态链接,共享对象(动态链接库)中的内容在运行时被映射到用户进程的虚地址空间。
链接程序所作的仅仅是在最终生成的可执行文件中记录下到哪里去找外部符号定义的目标代码。
这种情况下符号的外部引用与其定义的链接是在程序运行时完成的。
在这一节中,我们将详细地讨论链接过程。
如编译系统的一些缺省设置、用户如何生成自己的动态库或静态库、如何在程序中链接这些库文件,以及动态链接库是如何实现的,等等问题。
在掌握了这些内容之后,读者将能够高效地组织自己的源文件,提高开发的效率和程序的可维护性。
缺省设置前面一节中,我们使用:$ cc -o myprg myprog.c myfunc.c命令来生成可执行文件。
此时cc将生成同每一个C源程序对应的目标文件,并把它们彼此链接,以生成一个可执行的程序文件。
对于所生成的每一个目标文件,我们称之为可重定位的目标文件,因为这些目标文件中含有尚未同其定义相链接的符号引用,也即尚没有在内存中分配地址。
但我们可以注意到,myprog.c中所调用的printf()和myfunc.c中所调用的isdigit(),这两个函数是我们在自己的程序中所没有定义的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
UNIX常用命令第一章目录及文件操作命令1.1ls[语法]:ls [-RadCxmlnogrtucpFbqisf1] [目录或文件......][说明]:ls 命令列出指定目录下的文件,缺省目录为当前目录./,缺省输出顺序为纵向按字符顺序排列。
-R 递归地列出每个子目录的内容-a 列出所有文件,包括第一个字符为“.”的隐藏文件-d 若后面参数是目录,则只列出目录名而不列出目录内容,常与-l选项连用以显示目录状态。
-C 输出时多列显示-x 横向按字符顺序排列-m 输出按流式格式横向排列,文件名之间用逗号(,)分隔-l 长列表输出,显示文件详细信息,每行一个文件,从左至右依次是:文件存取模式链接数文件主文件组文件字节数上次修改时间其中文件存取模式用10个字母表示,从左至右的意义如下:第一个字母表示文件种类,可以是以下几种情况:d 为目录文件l 为链接b 为块文件c 为字符型文件p 为命名管道(FIFO)- 为普通文件后面9个字母分别表示文件主、同组用户、其他用户对文件的权力,用r表示可读,w 表示可写,x 表示可执行。
如果是设备文件,则在文件字节数处显示:主设备从设备。
-n 与-l选项相同,只是文件主用数字(即UID)显示,文件组用数字(即GID)表示-o 与-l选项相同,只是不显示文件组-g 与-l选项相同,只是不显示文件主-r 逆序排列-t 按时间顺序排列而非按名字-u 显示时间时使用上次访问时间而非上次修改时间-c 显示时间时使用上次修改i节点时间而非上次修改时间-p 若所列文件是目录文件,则在其后显示斜杠(/)-F 在目录文件后加’/’,在可执行文件后加’*’-b 文件名中若有非打印字符,则用八进制显示该字符-q 文件名中的打印字符用’?’表示-i 显示节点号-s 显示文件长度时使用块长度而非字节长度-f 将后面的参数解释为目录并列出其中的每一项-1 每行仅列一项[例子]:ls 列出当前目录下的文件ls -al /bin 以长列表的形式列出目录/bin 下的所有文件,包括隐藏文件1.2 pwd[语法]: pwd[说明]:本命令用于显示当前的工作目录[例子]:pwd 显示出当前的工作目录1.3 cd[语法]: cd [目录][说明]:本命令用于改变当前的工作目录,无参数时使用环境变量$HOME 作为其参数,$HOME 一般为注册时进入的路径。
[例子]:cd 回到注册进入时的目录cd /tmp 进入 /tmp 目录cd ../ 进入上级目录1.4 mkdir[语法]: mkdir [-m 模式] [-p] 目录名[说明]: 本命令用于建立目录,目录的存取模式由掩码(umask)决定,要求对其父目录具有写权限,目录的UID和GID为实际UID和GID-m 按指定存取模式建立目录-p 建立目录时建立其所有不存在的父目录[例子]:mkdir tmp 在当前目录下建立子目录 tmpmkdir -m 777 /tmp/abc 用所有用户可读可写可执行的存取模式建立目录 /tmp/aaa ,存取模式参看命令 chmodmkdir -p /tmp/a/b/c 建立目录 /tmp/a/b/c ,若不存在目录 /tmp/a及/tmp/a/b 则建立之1.5 rmdir[语法]: rmdir [-p] [-s] 目录名[说明]: 本命令用于删除目录-p 删除所有已经为空的父目录-s 当使用-p 选项时,出现错误不提示[例子]:rmdir /tmp/abc 删除目录 /tmp/abcrmdir -p /tmp/a/b/c 删除目录 /tmp/a/b/c ,若目录 /tmp/a /b及/tmp/a 空,则删除1.6 cat[语法]: cat [-u] [-s] [-v[-t] [-e]] 文件...[说明]: 显示和连接一个或多个文件至标准输出-u 无缓冲的输出(缺省为有缓冲输出)-s 对不存在的文件不作提示-v 显示出文件中的非打印字符,控制字符显示成^n ,n为八进制数字,其他非打印字符显示成M-x , x 为该字符低7位的8进制数值-t 在使用-v 选项时,将制表符(tab)显示成 ^I,将换页符(formfeed)显示成 ^ L-e 在使用-v 选项时,在每一行的行尾显示 $[例子]:cat file 显示文件cat -s -v -e file1 file2 file3 逐个显示文件 file1 file2 file31.7 head[语法]: head [-n] [文件 ...][说明]: 将文件的头n 行显示输出,缺省值为 10 行,显示多个文件时,在每个文件的前面加上 ==> 文件名 <==[例子]:head -9999 file1 file2 显示文件 file1 和 file2 的头 9999 行1.8 more[语法]: more [-cdflrsuw] [-行数] [+ 行数] [+ / 模式 ] [ 文件 ... ][说明]: 将文件显示在终端上,每次一屏,在左下部显示--more--,若是从文件读出而非从管道,则在后面显示百分比,表示已显示的部分,按回车键则上滚一行,按空格键则上滚一屏,未显示完时可以使用more 命令中的子命令。
-c 显示文件之前先清屏-d 当输错命令时显示错误信息而不是响铃(bell)-f 不折叠显示长的行-l 不将分页控制符(CTRL D)当作页结束-r 一般情况下,more 不显示控制符,本选项使more 显示控制符,例如,将 (CTRL C) 显示成 ^ C-s 将多个空行转换成一个空行显示-u 禁止产生下划线序列-w 一般情况下 more 显示完后立即推出,本选项在显示完后作提示,敲任意键后推出-n 行数指定每屏显示的行数+ 行号从指定行号开始显示+/模式在文件中搜索指定模式,从模式出现行的上两行开始显示文件未显示完时,可以使用more 命令中的子命令,命令中除了! 和 / 以外均不回显,也不用敲回车,当命令破坏 more 提示行时,可用退格键恢复提示行。
在以下子命令操作中,i 表示数字,缺省值为 1。
i 空格上滚一屏多 i 行i 回车上滚 i 行i CTRL+D i 缺省时上滚 11 行,否则上滚 i 行id i 缺省时上滚 11 行,否则上滚 i 行iz i 缺省时上滚一屏,否则定义每屏为 i 行is 跳过 i 行后显示一屏if 跳过 i 屏后显示一屏i CTRL+B 跳回 i 屏后显示一屏b 跳回一屏后显示一屏q 或 Q 推出 more= 显示当前行号v 从当前行开始编辑当前文件编辑器由环境变量$EDITOR定义h 显示帮助信息i / 模式向前搜索,直至模式的第 i 次出现,从该行的上两行开始显示一屏in 向前搜索,直至上一模式的第 i 次出现,从该行的上两行开始显示一屏单引号回到上次搜索的出发点,若无搜索则回到开始位置! 命令激活一个sh 去执行指定的命令i : n 跳到后面第 i 个文件,若不存在则跳到最后一个文件:f 显示当前文件名和行号:q 或:Q 推出 more. (点) 重复上次命令[ 例子]:more -c +50 file 清屏后,从第50行开始显示文件 filemore -s -w file1 file2 file3 显示文件 file1 file2 file31.9 cp[语法]: cp [ -p ] [ -r ] 文件 1 [ 文件 2 ...] 目标[说明]: 将文件1(文件2 ...)拷贝到目标上,目标不能与文件同名,若目标是文件名,则拷贝的文件只能有一个,若目标是目录,则拷贝的文件可以有多个,若目标文件不存在,则建立这个文件,若存在,则覆盖其以前的内容,若目标是目录,则将文件拷贝到这个目录下。
- i 在覆盖已存在文件时作提示,若回答 y 则覆盖,其他则中止- p 不仅拷贝文件内容,还有修改时间,存取模式,存取控制表,但不拷贝UID 及 GID- r 若文件名为目录,则拷贝目录下所有文件及子目录和它们的文件,此时目标必须为目录[例子]:cp file1 file2 将文件 file1 拷贝到文件 file2cp file1 file2 /tmp 将文件 file1 和文件 file2 拷贝到目录 /tmp 下cp -r /tmp /mytmp 将目录 /tmp 下所有文件及其子目录拷贝至目录/mytmp1.10 mv[语法]: mv [-f] [-i] 文件1 [文件2...] 目标[说明]: 将文件移动至目标,若目标是文件名,则相当于文件改名- i 在覆盖已存在文件时作提示,若回答 y 则覆盖,其他则中止- f 覆盖前不作任何提示[例子]:mv file1 file2 将文件 file1 改名为 file2mv file1 file2 /tmp 将文件 file1 和文件 file2 移动到目录 /tmp 下1.11 rm[语法]: rm [-f] [-i] 文件...或 rm -r [-f] [-i] 目录名... [文件][说明]: 用来删除文件或目录- f 删除文件时不作提示- r 递归地删除目录及其所有子目录- i 删除文件之前先作提示[例子]:rm file1 删除文件 file1rm -i /tmp/* 删除目录 /tmp 下的所有文件rm -r /mytmp 递归地删除目录 /mytmp1.12 chmod[语法]: chmod [-R] 模式文件...或 chmod [ugoa] {+|-|=} [rwxst] 文件...[说明]: 改变文件的存取模式,存取模式可表示为数字或符号串,例如:chmod nnnn file , n为0-7的数字,意义如下:4000 运行时可改变UID2000 运行时可改变GID1000 置粘着位0400 文件主可读0200 文件主可写0100 文件主可执行0040 同组用户可读0020 同组用户可写0010 同组用户可执行0004 其他用户可读0002 其他用户可写0001 其他用户可执行nnnn 就是上列数字相加得到的,例如 chmod 0777 file 是指将文件 file 存取权限置为所有用户可读可写可执行。
-R 递归地改变所有子目录下所有文件的存取模式u 文件主g 同组用户o 其他用户a 所有用户+ 增加后列权限- 取消后列权限= 置成后列权限r 可读w 可写x 可执行s 运行时可置UIDt 运行时可置GID[例子]:chmod 0666 file1 file2 将文件 file1 及 file2 置为所有用户可读可写chmod u+x file 对文件 file 增加文件主可执行权限chmod o-rwx 对文件file 取消其他用户的所有权限1.13 chown[语法]: chown [-R] 文件主文件...[说明]: 文件的UID表示文件的文件主,文件主可用数字表示,也可用一个有效的用户名表示,此命令改变一个文件的UID,仅当此文件的文件主或超级用户可使用。